Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.008 c
14-23389
Карлсон
2003-04-21 21:17
2003.05.08
Win2K и install


1-23085
Shuric
2003-04-24 22:09
2003.05.08
GetTickCount


6-23256
CYBERDANYA
2003-03-12 22:56
2003.05.08
Proxy на Indy в Delphi 6


1-23120
scorpi
2003-04-27 18:58
2003.05.08
Цвета строк в Memo и RichEdit


3-22914
Rocker
2003-04-19 09:48
2003.05.08
Базы данных TTable





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский