Текущий архив: 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