Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
ВнизКак скопировать число из памяти в переменную Найти похожие ветки
← →
Berger (2010-03-17 17:50) [0]Добрый день!
Имею массив байт: TDynamicArray = array[1..4] of byte;
на него указывает переменная: buff:^TDynamicArray;
в нём есть 4 байта: 0x0,0x0,0x0,0x9
т.е. фактически, это dword равный 9.
Как мне скопивать эти значения в стандартную переменную vr типа integer или dword?
Есть варианты
vr:=StrToInt("0x"+IntToHex(buff^[1],2)+IntToHex(buff^[2],2)+IntToHex(buff^[3],2)+IntToHex(buff^[4],2));
или
vr:=trunc(buff^[1]*power(2,32)+buff^[2]*power(2,16)+buff^[3]*power(2,8)+buff^[4]);
но это как-то коряво, на мой взгляд...
← →
Rouse_ © (2010-03-17 17:59) [1]0x0,0x0,0x0,0x9 это не 9, а 150994944 (т.к. обратный порядок байт).
Перенести очень просто:var
D: DWORD;
begin
D := PDWORD(buff)^;
..
← →
Leonid Troyanovsky © (2010-03-17 18:15) [2]
> Rouse_ © (17.03.10 17:59) [1]
> Перенести очень просто:
Перенести это Move, IMHO.
--
Regards, LVT.
← →
Anatoly Podgoretsky © (2010-03-17 19:59) [3]> Berger (17.03.2010 17:50:00) [0]
LongRec - побайтно, паралельно переворачивая байты, что бы в результате получилось 9
Про порядок байт читай выше
← →
Rouse_ © (2010-03-17 20:37) [4]
> Leonid Troyanovsky © (17.03.10 18:15) [2]
>
> > Rouse_ © (17.03.10 17:59) [1]
>
> > Перенести очень просто:
>
> Перенести это Move, IMHO.
Согласен, то на 4 байтовом блоке это из пушки по воробьям, тоже имх конечно :)
← →
Leonid Troyanovsky © (2010-03-17 22:41) [5]
> Rouse_ © (17.03.10 20:37) [4]
> Согласен, то на 4 байтовом блоке это из пушки по воробьям,
> тоже имх конечно :)
> Rouse_ © (13.03.10 12:18) [16]
> WriteProcessMemory(hProc, P, @Data, 4, lpNumberOfBytesWritten);
Хотя, это две большие разницы, IMHO, конечно :)
--
Regards, LVT.
← →
Jeer © (2010-03-17 23:35) [6]Berger (17.03.10 17:50)
Добрый день!
Имею массив байт: TDynamicArray = array[1..4] of byte;
на него указывает переменная: buff:^TDynamicArray;
в нём есть 4 байта: 0x0,0x0,0x0,0x9
т.е. фактически, это dword равный 9.
Как мне скопивать эти значения в стандартную переменную vr типа integer или dword?
Есть варианты
vr:=StrToInt("0x"+IntToHex(buff^[1],2)+IntToHex(buff^[2],2)+IntToHex(buff^[3],2)+IntToHex(buff^[4],2));
или
vr:=trunc(buff^[1]*power(2,32)+buff^[2]*power(2,16)+buff^[3]*power(2,8)+buff^[4]);
но это как-то коряво, на мой взгляд...
**********************************
Не просто коряво, а.. неразумно.
Можно отослать Вас к книжкам и нужно..
Мужики тут наговорили много полезного, но бесполезного..
Попробуем на дидактической основе:
1. TDynamicArray: стандартно - это объявление типа, переменные объявляются без T
2. В названии присутствует DynamicArray, т.е. динамический массив, а объявлен - статический. Непорядок.
3. Ни к чему дополнительный указатель на массив, переменная массива по сути и так указатель
4. Указаны значения байт, а также соответствие им суммарного слова. Исходя из чего считаем, что младшему индексу массива соотвествует старший байт.
5. Вариантов "сборки" dw-слова из массива байтов - масса.
Предложим "образовательный вариант:
- Объявляем переменные, которые будут содержать байты из массива
W3,W2,W1,W0: byte;
- Объявляем массив
ar4: array[0..3] of byte;
- Инициализируем массив ( можно это делать и при объявлении, но упрощаем для понимания )
ar4[0] := 0; //
ar4[1] := 1; // i * 65536
ar4[2] := 1; // i * 256
ar4[3] := 9;
- Выцыганиваем из массива отдельные байты и заносим их значения в байтовые переменные
W3 := ar4[0];
W2 := ar4[1];
W1 := ar4[2];
W0 := ar4[3];
- Формируем слово из отдельных байт:
dw := (W3 shl 24) + (W2 shl 16) + (W1 shl 8) + W0;
P.S.
В принципе, исходя из учебности задачи, следовало бы объявить переменные W*, как DWord - поскольку мы размещаем каждый байт из массива
в младший байт DWord, а затем сдвигаем.
Однако и поскольку, мы разместили все операции в одной строке, компилятор "понимает", что нам надо сформировать из "сдвинутых" байт dw-слово,
а поэтому он ( компилятор ) расширяет каждый байт ( W*) до dw-слова, выполняет сдвиг в сетке 32-разряда, складывает результаты сдвига и отдает итоговое правильное dw-слово.
P.S.
Как можно сделать это проще и непонятнее - наверняка найдутся апологеты.
Я всего лишь рассказал автору поста об основах.
← →
Германн © (2010-03-18 00:38) [7]<offtop>
>
> Есть варианты
> vr:=StrToInt("0x"+IntToHex(buff^[1],2)
Ух ты! А с каких пор StrToInt стала понимать сишный вариант hex-записи? Или это всегда было возможно?
Причем asm-вариант т.е. с h после цифр не понимает.
</offtop>
← →
Anatoly Podgoretsky © (2010-03-18 08:35) [8]> Jeer (17.03.2010 23:35:06) [6]
> Я всего лишь рассказал автору поста об основах.
А не запутал?
← →
brother © (2010-03-18 09:34) [9]> А не запутал?
убил...
← →
Rouse_ © (2010-03-18 10:37) [10]
> Leonid Troyanovsky © (17.03.10 22:41) [5]
> > WriteProcessMemory(hProc, P, @Data, 4, lpNumberOfBytesWritten);
> Хотя, это две большие разницы, IMHO, конечно :)
Конечно - процессы то разные :)
← →
Franzy (2010-03-18 13:56) [11]У меня в такой ситуации move прекрасно работала.
← →
Berger (2010-03-18 14:01) [12]
> Jeer © (17.03.10 23:35) [6]
dw := (W3 shl 24) + (W2 shl 16) + (W1 shl 8) + W0;
спасибо!
ровно то, о чём я спрашивал
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.1 c