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

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

Конвертация массива из byte-ов в integer [D7, XP]


misere ©   (2007-02-13 12:23:00) 

Помогите решить задачу:
Дан массив array[0..3] of byte и нужно представить этот массив в виде целого integer. И обратное: дано integer -> перевести в массив из byte-ов. Че-то никто не знает :(((


Arm79   (2007-02-15 18:35:00) [1]

1)

 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;

2)

 Result := 0;
 for i := 3 downto 0
 do begin
   Result := Result + IntArray[i];
   if i > 0 then Result := Result shl 8;
 end;

3)

 см. пост 2

4)

 System.Move(IntArray[0], Result, 4); // у меня динамический массив байтов

5)

 пост 1

6)

 пост 6
 var
    Temp: integer;
    IntArray: array [0..3] of byte absolute Temp;


Германн   (2007-02-15 13:09:00) [2]


> misere   (15.02.07 10:30) [17]
>
> Спасибо за ответы :)
> Можете объяснить вариантную запись?
>

А что именно непонятно? Вариантная запись, а точнее вариантная часть записи позволяет компиллятору трактовать одну и ту же область памяти по разному. В примере [9] к данной области памяти можно обращаться и как к массиву байт и как к переменной типа Integer.


misere   (2007-02-15 10:30:00) [3]

Спасибо за ответы :)
Можете объяснить вариантную запись?

Зы: я пытался вообще решить влоб - перевожу integer в "нули и единицы", разбиваю на четыре и каждый по очереди перевожу обратно, проверяя на минус и -0 :)))


Leonid Troyanovsky   (2007-02-13 19:39:00) [4]


> begin...end ©   (13.02.07 18:11) [15]

> Впрочем, надеюсь, что мне можно простить это преступление.
> .. за давностью лет :-)


За (исковой) давностью: >= 3 года, IMHO.
Для неособо тяжких ;)

--
Regards, LVT.


begin...end   (2007-02-13 18:11:00) [5]

> Kolan ©   (13.02.07 17:55) [14]

Что ж... если так, значит, я тогда предложил не очень красивое решение.
Впрочем, надеюсь, что мне можно простить это преступление... за давностью лет :-)


Kolan   (2007-02-13 17:55:00) [6]


begin...end ©
> Переменная Temp здесь не нужна. TempArr: ... absolute Result.

Именно вы тогда(года 2 назад) и научили :)


evvcom   (2007-02-13 14:48:00) [7]

> [9] Германн ©   (13.02.07 13:35)
> Про вариантную запись никто не вспомнил :(

Я вспомнил, но писать было лень. Буковок много :)
> [10] icWasya ©   (13.02.07 14:25)
> А если вспомнить, в каком порядке идут байты в Integer...

В стандартном :)


Германн   (2007-02-13 14:45:00) [8]


> icWasya ©   (13.02.07 14:25) [10]
>
> А если вспомнить, в каком порядке идут байты в Integer..
> .

Ну так вспомни, никто не возражает?


olegnik   (2007-02-13 14:38:00) [9]

А можно вообще не тупить.
Используйте функцию MOVE(ресурс; приемник; SizeOf() );


icWasya   (2007-02-13 14:25:00) [10]

А если вспомнить, в каком порядке идут байты в Integer...


Германн   (2007-02-13 13:35:00) [11]

Про вариантную запись никто не вспомнил :(
TMyRecord = record
 case Integer of
    0 : (MyArr : array[0..3] of byte);
    1 : (MyInt : Integer);
end;


begin...end   (2007-02-13 13:01:00) [12]

> Kolan ©   (13.02.07 12:45) [6]

Переменная Temp здесь не нужна. TempArr: ... absolute Result.


evvcom   (2007-02-13 12:55:00) [13]

> [5] <Efir>   (13.02.07 12:38)

Ну а [1] видел? Для array [0..3] of Byte;[1] и [2] идентичны, тогда как твой [3] содержит ненужный цикл, сдвиги, умножение и прочие тормоза.


Kolan   (2007-02-13 12:45:00) [14]

absolute + F1
Пример:

function ConvertBytesToWord(HighByte, LowByte: Byte): Word;
var
 Temp: Word;
 TempArr: array[0..1] of Byte absolute Temp;
begin
 TempArr[1] := HighByte;
 TempArr[0] := LowByte;
 Result := Temp;
end;


&lt;Efir&gt;   (2007-02-13 12:38:00) [15]


> evvcom ©   (13.02.07 12:30) [4]


Я тогда ещё не видел твоего поста.


evvcom   (2007-02-13 12:30:00) [16]

> [3] <Efir>   (13.02.07 12:28)

И чем это круче? Тогда можно еще твой код разбавить сотней - другой холостых циклов.


&lt;Efir&gt;   (2007-02-13 12:28:00) [17]

А можно ещё круче.

for j:=3 downto 0 do  I:=I or (A[j] shl j*8)


evvcom   (2007-02-13 12:28:00) [18]

> [0] misere   (13.02.07 12:23)
> Че-то никто не знает :(((

Видимо, не у тех спрашивал :-)

MyInt := PInteger(@MyByteArray[0])^;- хотя все зависит от правила представления "в виде целого integer"


begin...end   (2007-02-13 12:26:00) [19]

var
 A: array [0..3] of Byte;
 I: Integer;
begin
 ...
 I := Integer(A);
 Integer(A) := I;
 ...
end


Наверх

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