![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как скопировать число из памяти в переменную [D5, WinXP]
Berger © (2010-03-17 17:50:00)Добрый день!
Имею массив байт: 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]);
но это как-то коряво, на мой взгляд...
Berger (2010-03-18 14:01:00) [1]
> Jeer © (17.03.10 23:35) [6]
dw := (W3 shl 24) + (W2 shl 16) + (W1 shl 8) + W0;
спасибо!
ровно то, о чём я спрашивал
Franzy (2010-03-18 13:56:00) [2]У меня в такой ситуации move прекрасно работала.
Rouse_ (2010-03-18 10:37:00) [3]
> Leonid Troyanovsky © (17.03.10 22:41) [5]
> > WriteProcessMemory(hProc, P, @Data, 4, lpNumberOfBytesWritten);
> Хотя, это две большие разницы, IMHO, конечно :)
Конечно - процессы то разные :)
brother (2010-03-18 09:34:00) [4]> А не запутал?
убил...
Anatoly Podgoretsky (2010-03-18 08:35:00) [5]> Jeer (17.03.2010 23:35:06) [6]
> Я всего лишь рассказал автору поста об основах.
А не запутал?
Германн (2010-03-18 00:38:00) [6]<offtop>
>
> Есть варианты
> vr:=StrToInt('0x'+IntToHex(buff^[1],2)
Ух ты! А с каких пор StrToInt стала понимать сишный вариант hex-записи? Или это всегда было возможно?
Причем asm-вариант т.е. с h после цифр не понимает.
</offtop>
Jeer (2010-03-17 23:35:00) [7]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.
Как можно сделать это проще и непонятнее - наверняка найдутся апологеты.
Я всего лишь рассказал автору поста об основах.
Leonid Troyanovsky (2010-03-17 22:41:00) [8]
> Rouse_ © (17.03.10 20:37) [4]
> Согласен, то на 4 байтовом блоке это из пушки по воробьям,
> тоже имх конечно :)
> Rouse_ © (13.03.10 12:18) [16]
> WriteProcessMemory(hProc, P, @Data, 4, lpNumberOfBytesWritten);
Хотя, это две большие разницы, IMHO, конечно :)
--
Regards, LVT.
Rouse_ (2010-03-17 20:37:00) [9]
> Leonid Troyanovsky © (17.03.10 18:15) [2]
>
> > Rouse_ © (17.03.10 17:59) [1]
>
> > Перенести очень просто:
>
> Перенести это Move, IMHO.
Согласен, то на 4 байтовом блоке это из пушки по воробьям, тоже имх конечно :)
Anatoly Podgoretsky (2010-03-17 19:59:00) [10]> Berger (17.03.2010 17:50:00) [0]
LongRec - побайтно, паралельно переворачивая байты, что бы в результате получилось 9
Про порядок байт читай выше
Leonid Troyanovsky (2010-03-17 18:15:00) [11]
> Rouse_ © (17.03.10 17:59) [1]
> Перенести очень просто:
Перенести это Move, IMHO.
--
Regards, LVT.
Rouse_ (2010-03-17 17:59:00) [12]0x0,0x0,0x0,0x9 это не 9, а 150994944 (т.к. обратный порядок байт).
Перенести очень просто:
var
D: DWORD;
begin
D := PDWORD(buff)^;
..