Форум: "Основная";
Текущий архив: 2003.05.08;
Скачать: [xml.tar.bz2];
ВнизРазобрать интегер на байты Найти похожие ветки
← →
Leviathan (2003-04-26 18:43) [0]Есть переменная типа Integer, которая занимает 4 байта (если ничего не путаю, но не в этом суть). Нужно записанное в нее число разбить на байты и записать в стринг из четырех символов. И обратная операция. Как к этому подойти хотя бы?
← →
NetBreaker666 (2003-04-26 19:03) [1]Самый дебильный способ:
type Ta=packed record
case byte of
0:(i:Integer);
1:(b1,b2,b3,b4:Byte);
End;
var i:Integer;
a:Ta;
...
a.i:=i;
a.b1,a.b2,a.b3,a.b4 - твои байты
Способ №2:
var t:Integer;
b1,b2,b3,b4:Byte;
...
b1:=t and $FF;
b2:=(t shr 8) and $FF
b3:=(t shr $10) and $FF
b4:=(t shr $18)
Способ номер 3
function GetByteN(a:Integer;n:Byte):Byte;
asm
shl edx,3
shr eax,edx
end;
(Нумерация начинается с нуля, т.е. GetByteN(a,0) - младший байт
← →
NetBreaker666 (2003-04-26 19:36) [2]Ой, способ №3 не так сделал:
function GetByteN(a:Integer;n:Byte):Byte;
asm
mov ecx,edx
shl ecx,3
shr eax,cl
end;
← →
default (2003-04-26 19:52) [3]1 байт - X and $FF
2 байт - X and $FF00
3 байт - X and $FF0000
4 байт - X and $FF000000
X - переменная типа Integer
← →
NetBreaker666 (2003-04-26 19:57) [4]Удалено модератором
Примечание: Сначала разговаривать научись..
← →
Snap (2003-04-26 20:10) [5]
> default © (26.04.03 19:52)
ты только сдвинуть забыл
← →
sniknik (2003-04-26 20:14) [6]NetBreaker666 © (26.04.03 19:03)
а почему первый самый дебильный? если работает, тем более еще в стринг преобразовывать.
немного поправленный "дебильный" способ.
type
Ta = packed record
b: byte;
case byte of
0: (i: Integer);
1: (b1,b2,b3,b4: Byte);
end;
var a: Ta;
s: string[4] absolute a;
begin
a.b:= 4;
a.i:= Число;
Label5.Caption:= s; <- требуемая строка
← →
NetBreaker666 (2003-04-26 20:28) [7]ОЙ, я про сторку не прочитал. 2Snikshik - твой код работать не будет. Ты забыл: s[0]:=#4 (или SetLength(S,4)). absolute тоже не покатит - нулевой байт - длина троки.
← →
sniknik (2003-04-26 20:34) [8]NetBreaker666 © (26.04.03 20:28)
а ты попробуй. (только не меняй ничего, например string[4] на string)
← →
Palladin (2003-04-26 20:56) [9]выдержка из справки
LongRec type
LongRec separates parts of a 4-byte value.
Unit
SysUtils
type
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;
Description
LongRec declares a record that stores the various parts of the specified value as type Word or Byte.
зачем велосипед изобретать
← →
NetBreaker666 (2003-04-26 21:12) [10]
> a.b:= 4;
ОЙ :) Не заметил
← →
Anatoly Podgoretsky (2003-04-26 22:14) [11]Palladin © (26.04.03 20:56)
Наверно в 6 версии появилось такое расширенное объявление, раньше только Lo, Hi - очень приятно.
← →
default (2003-04-26 22:32) [12]to Snap
Да, потом через 20 сек это понял, но потом не хотелось уже постить - отключился от инета...
← →
Palladin (2003-04-26 22:33) [13]Да у меня D6.
← →
default (2003-04-26 22:42) [14]type Ta=packed record
case byte of
0:(i:Integer);
1:(b1,b2,b3,b4:Char);
End;
а если сразу так не работает что ли?
сам не пробовал
← →
default (2003-04-26 23:05) [15]var
Rec: record
case Byte of
0: (X: Integer);
1: (Bytes: Array[1..4] of Char);
end;
при X = $DF456789:
Bytes[1] = #$89, Bytes[2] = #$67, Bytes[3] = #$45, Bytes[4] = #$DF
это на всякий случай...
вот так работает, проверял
P.S. ещё кто-то иногда говорит что Паскаль(Object Pascal) недостаточно гибок...хе!
← →
Sha (2003-04-27 09:15) [16]Туда:
SetLength(s,SizeOf(integer)); System.Move(i,s[1],SizeOf(integer));
Обратно:System.Move(s[1],i,SizeOf(integer));
← →
DrPass (2003-04-27 16:31) [17]Осталось только докторскую защитить по теме "как разбить integer на 4 байта"
← →
Sha (2003-04-27 19:19) [18]2DrPass © (27.04.03 16:31)
Просили...
← →
Anatoly Podgoretsky (2003-04-27 20:07) [19]Leviathan © (26.04.03 18:43)
Я внимательно посмотрел на твой вопрос, если ты собираешься использовать как строку, то нельзя, поскольку будет содержать непечатные символы или работать как со строкой.
Если как двоичное то MOVE Sha © (27.04.03 09:15), но больно дебильное применение как сказал NetBreaker, в чем суть этой пересылки?.
Можно легко сохранить как 8 символов - IntToHex, обратно StrToInt
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.05.08;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.009 c