Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как скопировать число из памяти в переменную [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)^;
 ..


Наверх

Титульная страница Поиск, карта сайта Написать письмо