Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

Как скопировать число из памяти в переменную   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.055 c
2-1268814184
Delphist
2010-03-17 11:23
2010.08.27
условие запроса


2-1273166923
worldmen
2010-05-06 21:28
2010.08.27
Ошибка при копиляции из Delphi 7 в Delphi 2010


15-1275393586
bss
2010-06-01 15:59
2010.08.27
Отключить скрол у TComboBox


2-1272025204
tippa
2010-04-23 16:20
2010.08.27
как хранить большие списки в самой программе?


15-1275337781
Юрий
2010-06-01 00:29
2010.08.27
С днем рождения ! 1 июня 2010 вторник