Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.03.04;
Скачать: CL | DM;

Вниз

Конвертация массива из byte-ов в integer   Найти похожие ветки 

 
misere   (2007-02-13 12:23) [0]

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


 
begin...end ©   (2007-02-13 12:26) [1]

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


 
evvcom ©   (2007-02-13 12:28) [2]

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

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

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


 
<Efir>   (2007-02-13 12:28) [3]

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

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


 
evvcom ©   (2007-02-13 12:30) [4]

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

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


 
<Efir>   (2007-02-13 12:38) [5]


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


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


 
Kolan ©   (2007-02-13 12:45) [6]

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;


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

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

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


 
begin...end ©   (2007-02-13 13:01) [8]

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

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


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

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


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

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


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

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


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


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

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


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

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

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

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


 
Kolan ©   (2007-02-13 17:55) [14]


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

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


 
begin...end ©   (2007-02-13 18:11) [15]

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

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


 
Leonid Troyanovsky ©   (2007-02-13 19:39) [16]


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

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


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

--
Regards, LVT.


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

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

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


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


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

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


 
Arm79 ©   (2007-02-15 18:35) [19]

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;



Страницы: 1 вся ветка

Текущий архив: 2007.03.04;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.031 c
2-1171137763
Рустам
2007-02-10 23:02
2007.03.04
Как перенести приложение на другую машину


2-1170657197
whitebarin
2007-02-05 09:33
2007.03.04
Где найти прикольный счетчик с перелистыванием цифр?


15-1170833004
Alkid
2007-02-07 10:23
2007.03.04
Сёстры Магдалины


2-1171353513
Lacky Star
2007-02-13 10:58
2007.03.04
ExcelApplication


15-1171190336
Ученик чародея
2007-02-11 13:38
2007.03.04
Far vs Total Commander vs Delphi