![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как 4 byte привести к longword [D6, XP]
novai © (2009-02-19 14:34:00)как реализовать подобную функцию
function 4bytetoword(a,b,c,d:byte):longword;
Германн (2009-02-20 01:04:00) [1]
> han_malign © (19.02.09 14:56) [9]
Моё любимое решение.
palva (2009-02-19 22:15:00) [2]Не очень экономно делать сдвиги на 24 бита. Время выполнения сдвига зависит от величины сдвига. так что лучше так:
n = (((b1 shl 8 or b2) shl 8 or b3) shl 8) or b4
Anatoly Podgoretsky (2009-02-19 15:36:00) [3]
> Jack128_ (19.02.09 15:27) [14]
Успел ответить, ну нравятся людям самодельные лисапеды, но с другой стороны и польза есть.
Юрий Зотов (2009-02-19 15:35:00) [4]> Jack128_ (19.02.09 15:27) [14]
Так каждый ламер сможет. А мы, ][акер'ы легких путей не ищем!
Jack128_ (2009-02-19 15:27:00) [5]народ, акститесь.. В SysUtils уже обявлены эти рекорды для подобных задач. LongRec/WordRec/Int64Rec...
RTFS
Юрий Зотов (2009-02-19 15:23:00) [6]> novai (19.02.09 14:57) [10]
TByte4 = packed record
a, b, c, d: byte;
end;
function UnpackLongWord(LW: LongWord): TByte4;
begin
Result := TByte4(LW);
end;
novai (2009-02-19 15:20:00) [7]
> han_malign © (19.02.09 15:09) [11]
принял к сведению (записал на будущее) огромное, человеческое спасибо Вам всем от новичка
han_malign (2009-02-19 15:09:00) [8]
> если например result такого типа
> byte4 = record
...
with Result do begin
см. Юрий Зотов © (19.02.09 14:52) [8]
end;
...
var __dwResult: LongWord absolute Result;
...
type Pbyte4 = ^byte4;
Result:= Pbyte4(@dw)^;
(хотя, кажется, иResult:= byte4(dw)прокатит)
...
type
TLongWord = packed record
case Integer of
0: ( four_byte: byte4);
1: ( wLo, wHi: word );
2: ( dw: LongWord );
end;
lw.dw:= dw;
Result:= lw.four_byte;
novai (2009-02-19 14:57:00) [9]Спасибо Юрий, но распаковывать не надо), но все же интересно как если например result такого типа:
byte4 = record
a,b,c,d:byte;
end;
han_malign (2009-02-19 14:56:00) [10]еще 5 копеек
type
TLongWord = packed record
case Integer of
0: ( b1,b2,b3,b4: byte );
1: ( wLo, wHi: word );
2: ( dw: LongWord );
end;
Юрий Зотов (2009-02-19 14:52:00) [11]> novai (19.02.09 14:45) [7]
Следующий вопрос будет - а как теперь распаковать?
:o)
a := LW shr 24;
b := (LW and $FF0000) shr 16;
c := (LW and $FF00) shr 8;
d := LW and $FF;
novai (2009-02-19 14:45:00) [12]спасибо всем, все упаковалось!
Юрий Зотов (2009-02-19 14:41:00) [13]function PackToLongWord(a, b, c, d: byte): LongWord;
begin
Result = a shl 24 or b shl 16 or c shl 8 or d
end;
novai (2009-02-19 14:40:00) [14]те я имел ввиду, чтобы имея 4 byte объеденить их или сгруппировать в longword
Сергей М. (2009-02-19 14:39:00) [15]реализация напрямую зависит от требуемого порядка следования байтов-параметров в результирующем лонгворде
MBo (2009-02-19 14:38:00) [16]Один из способов (порядок зависит от потребностей)
Result := (a shl 24) or (b shl 16) or (c shl 8) or d;
Медвежонок Пятачок (2009-02-19 14:37:00) [17]Move()
Palladin (2009-02-19 14:37:00) [18]
function 4bytetoword(a,b,c,d:byte):longword;
Var
l:Array [0..3] of Byte Absolute Result;
Begin
l[0]:=
l[1]:=
l[3]:=
l[4]:=
End.