Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.09 c
2-1267595287
allrussia
2010-03-03 08:48
2010.08.27
Перекодировка русского текста DOS+ANSI в ANSI


6-1223337489
Вэн
2008-10-07 03:58
2010.08.27
Рассылка сообщений в лок. сети


2-1271611512
Mishka
2010-04-18 21:25
2010.08.27
Отступ в начале DBEdit


2-1272456320
Вадим
2010-04-28 16:05
2010.08.27
Одна функция для двух одинаковых компонент, возникла проблема


2-1272882198
Раиса
2010-05-03 14:23
2010.08.27
DataType - какой для double?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский