![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Отобразить 4 байта
Ш-К © (2007-05-31 05:22:00)У меня есть число Integer, в нутрях выглядит так:
TValue = record
X, Y, Z, W: Byte;
end;
Мне надо переставить байты, чтобы получилось:
TValue = record
Z, Y, X: Byte;
end;
а вместо W - 0.
Непример:
$AF223344 -> $00443322
$EEAABBCC -> $00CCBBAA
Я могу разделить исходное число 3 раза на 255, получить байты, переставить их, а потом, умножая их на 255, 255^2, 255^3, сложить.
Но хочется узнать, какое есть красивое решение?
Anatoly Podgoretsky (2007-05-31 21:42:00) [1]> Ш-К (31.05.2007 05:22:00) [0]
LongRec
Barloggg (2007-05-31 09:17:00) [2]ой не глянул в задачу надо так (см [3])
i.W:= i.X;
i.X:= i.Z;
i.Z:= i.Y;
i.Y:= i.X;
i.X:= 0;
Barloggg (2007-05-31 09:14:00) [3]и еще один способ можно в эту кучу добавить
type TValue=packed record
case integer of
0: (TInteger:Integer);
1: (X, Y, Z, W: Byte);
end;//главное чтобы сошлось по числу байт
var tmp:byte;
var i:Tvalue;
begin
...
i.Tinteger:=нужное число
tmp:=i.y;
i.y:=i.z;
i.z:=tmp
Kolan (2007-05-31 09:05:00) [4]> «красивее»
Еще «красивши» сделать в записи метод типа Assign и выше сказаное проделать там
sniknik (2007-05-31 08:41:00) [5]"красивее"
type
TValue = packed record
X: Byte;
YZ:Word;
W: Byte;
end;
var
i: integer;
begin
....
with TValue(i) do begin
W:= X;
swap(YZ);
X:= 0;
end;
X9 (2007-05-31 08:40:00) [6]> [4] Ш-К (31.05.07 08:34)
> Класс
Точно. Особенно, если TValue объявить как packed record и привести к типу Integer.
Ш-К (2007-05-31 08:34:00) [7]Класс
sniknik (2007-05-31 08:14:00) [8]type
TValue = record
X, Y, Z, W: Byte;
end;
var
i: integer;
begin
....
with TValue(i) do begin
W:= X;
X:= Z;
Z:= Y;
Y:= X;
X:= 0;
end;
MBo (2007-05-31 06:49:00) [9]ассемблерная инструкция bswap устроит?
если нет, то
i := ((i and $FF) shl 16) or (i and $FF00) or ((i shr 16) and $FF)
SlymRO (2007-05-31 05:38:00) [10]
program Project2;
{$APPTYPE CONSOLE}
uses SysUtils,WinSock;
var i:integer;
begin
i:=$AF223344;
writeln(IntToHex(i,8));
i:=htonl(i) shr 8;
writeln(IntToHex(i,8));
readln;
end.