Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Преобразовать integer в array of byte


Автор: Paradox 5.2.2004, 07:31
Как можно преобразовать
Код
integer
в
Код
array[1..4] of byte
в сях есть классные операции сдвига, а на дельфи сталкиваться не приходилось
Как можно такое сделать подскажите плиз

Автор: <Spawn> 5.2.2004, 07:54
Для сдвига используй shr и shl. Но можно и по другому узнать байты:

Код
i: integer;
LongRec(i).Bytes[0]

Автор: Paradox 5.2.2004, 08:33
<Spawn> спасибо большое, только
Код
LongRec(i).Bytes[0]
не работает
так как там только Lo и Hi для longrec, но с использованием сдвигов все ок
Все получилось, короче говоря !!!

Автор: <Spawn> 5.2.2004, 09:13
Хорошо, что у тебя получилось, но хочу заметить что LongRec.Bytes и есть array[1..4] of Byte smile.gif, т.е. можно использовать на свое усмортрение любой байт из integer. Или ты имелл ввиду биты?

Автор: Paradox 5.2.2004, 12:48
Код
type

 LongRec = packed record
   Lo, Hi: Word;
 end;
это из хелпа
вероятно на
Код
LongRec.Bytes
компилятор из-за этого и ругается, или я совсем дятлом стал и ниче не понимаю ?

Автор: x77 5.2.2004, 12:57
Код

procedure TForm1.Button1Click(Sender: TObject);
type
 t = array [1..4] of byte;
var
 n: integer;
 a: t absolute n; // засовываем в память по тому же адресу, что и n
begin
 n := StrToInt (Edit1.Text); // всё, все данные уже на месте.

 ShowMessage (IntToStr (a [1]) + ',' +
   IntToStr (a [2]) + ',' +
   IntToStr (a [3]) + ',' +
   IntToStr (a [4]));
end;

Автор: <Spawn> 5.2.2004, 13:39
Paradox Вот как выглядит LongRec в SysUtils.pas:

Код
 LongRec = packed record
   case Integer of
     0: (Lo, Hi: Word);
     1: (Words: array [0..1] of Word);
     2: (Bytes: array [0..3] of Byte);
 end;

Автор: Paradox 5.2.2004, 14:18
<Spawn> а у меня так
Код
LongRec = packed record
   Lo, Hi: Word;
 end;

Стоить 5-я Дельфя
<Spawn> Огромное спасибо за участие в проблеме

Автор: dm9 7.2.2004, 13:00
a : array [1..4] of byte;
b : integer;

a[1] := b and $FF;
a[2] := b and $FF00 shr 8;
a[3] := b and $FF0000; shr 16;
a[4] := b shr 24;

smile.gif

Автор: RinOSpro 23.7.2008, 15:09
  a[1] := Hi(i shr 16); 
  a[2] := Lo(i shr 16); 
  a[3] := Lo(i shr 8);  
  a[4] := Lo(i);

Автор: VICTAR 23.7.2008, 15:14
RinOSpro,  smile 
за 4 года тема явно не потеряла свою актуальность  smile 

Автор: Snowy 23.7.2008, 15:24
Фу. Не ковыряй мёртвых...

Автор: VICTAR 23.7.2008, 15:33
Поздно, уже запах пошел
/пошел открывать форточку
 smile 

Автор: Virtuals 23.7.2008, 15:51
ух ща отвечу smile 
Код

Var
  Ai:integer;
  Bb:array[1..4] of byte absolute Ai;
begin
end

все пользуйте наздоровье хоть из Ai в Bb, хоть обратно smile 
у кого получится короче? smile 

Автор: RinOSpro 25.7.2008, 09:47
Цитата(Snowy @  23.7.2008,  15:24 Найти цитируемый пост)
Фу. Не ковыряй мёртвых...


А мне как раз нужно было такое же сделать только предложенные варианты что то не устраивали... ну сделал по своему решил выложить )

Virtuals а вот absolute лучше не использовать...

Автор: Virtuals 25.7.2008, 10:58
RinOSpro, а я все равно буду, и пофиг что не рекомендуют. так как указав одно и то-же место в памяти как разные типы данных, это супер, и нет вообще никакого лишнего кода.

Автор: Чучмек 25.7.2008, 21:55
Код

var
n, i:integer;
mb:array[0..3]of byte;
begin

n:=....
for i:=0 to 3 do
mb[i]:=pbyte(integer(@n)+i)^;

end;


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)