![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Каким способом лучше всего собрать из байтов Integer? [D7, 2000, XP, 2003]
Arm79 © (2007-01-30 16:55:00)Есть динамический массив байтов. Это разложенный Integer
Вопрос: как лучше всего собрать из байтов целый Integer?
Последовательность байтов в массиве жестко не задана, я сделал так, чтобы первым элементом был самый младший байт, далее по возрастанию
IntArray := ReadBytes(Data, 4, Position);
// так работает
Result := 0;
for i := 3 downto 0
do begin
Result := Result + IntArray[i];
if i > 0 then Result := Result shl 8;
end;
// так тоже
Result := 0;
for i := 0 to 3
do begin
TempByte := IntArray[i];
for j := 0 to 7
do begin
Inc(Result, (TempByte and 1) * Trunc(Power(2, j + i*8)));
TempByte := TempByte shr 1;
end;
end;
// А хотелось бы как то вроде этого. НЕ РАБОТАЕТ )
// Пытался по разному писать, но результат отрицательный
System.Move(IntArray, Result, 4);
vrem (2007-01-30 20:44:00) [1]function asmdw(pal,blue,green,red:byte):longword;
asm
shl edx,24
shld eax,edx,8
shl ecx,24
shld eax,ecx,8
mov dl,[ebp+$8]
shl edx,24
shld eax,edx,8
end;
Джо (2007-01-30 19:48:00) [2]Сорри, поменять местами Source и Destination.
Джо (2007-01-30 19:47:00) [3]
> // А хотелось бы как то вроде этого. НЕ РАБОТАЕТ ) //
> Пытался по разному писать, но результат отрицательный System.
> Move(IntArray, Result, 4);
Move (Int,IntArray[0],4);
sniknik (2007-01-30 19:38:00) [4]> у меня ведь был динамический массив
ну тогда и уточняй на динамическом, а то в [5] пример получился ошибочным.
а в общем понятно, что ты хотел показать.
я кстати не обратил внимания на то что в вопросе динамический, просто привел аналог [2] без "лишнего" действия.
Arm79 (2007-01-30 17:30:00) [5]
> sniknik © (30.01.07 17:13) [3]
> var
> MyByteArray: array[0..3] of Byte;
> MyIntegerVariable: Integer absolute MyByteArray;
> begin
> ...
> end;
Небольшое уточнение:
var
MyByteArray: array[0..3] of Byte;
MyIntegerVariable: PInteger absolute MyByteArray;
begin
Result := MyIntegerVariable ^;
end;
Arm79 (2007-01-30 17:30:00) [6]у меня ведь был динамический массив
Arm79 (2007-01-30 17:25:00) [7]
> sniknik © (30.01.07 17:13) [3]
> var
> MyByteArray: array[0..3] of Byte;
> MyIntegerVariable: Integer absolute MyByteArray;
> begin
> ...
> end;
Уже не раз замечал что после ваших ответов узнаю что то новое )
Такую конструкцию никогда не видел. Теперь читаю Help
> Сергей М. © (30.01.07 17:10) [2]
> var
> MyByteArray: array[0..3] of Byte;
> MyIntegerVariable: Integer;
>
> ..
>
> MyIntegerVariable := PInteger(@MyByteArray)^;
Без собаки все работает, сенкс
sniknik (2007-01-30 17:13:00) [8]var
MyByteArray: array[0..3] of Byte;
MyIntegerVariable: Integer absolute MyByteArray;
begin
...
end;
Сергей М. (2007-01-30 17:10:00) [9]var
MyByteArray: array[0..3] of Byte;
MyIntegerVariable: Integer;
..
MyIntegerVariable := PInteger(@MyByteArray)^;
JFK&MM_extramarital_son (2007-01-30 16:57:00) [10]Заблудился в трех соснах?
точне четырех.