Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как 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.


Наверх

Титульная страница Поиск, карта сайта Написать письмо