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

Вниз

Разобрать интегер на байты   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.027 c
1-23191
lego_2
2003-04-24 22:30
2003.05.08
TPopUpMenu иль всё от TMenu


14-23283
Manulo
2003-04-21 16:01
2003.05.08
Библиотеки C++ и Delphi


1-23128
Zheka
2003-04-27 23:20
2003.05.08
Hint над объектом


3-22976
SiJack
2003-04-17 13:51
2003.05.08
Каскадное удаление в Access (ADO)


1-23056
vandal
2003-04-25 16:18
2003.05.08
Функция RadToDeg и т.д.