Главная страница
    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.009 c
3-22945
Bug
2003-04-21 12:50
2003.05.08
сортировка ADO Table


3-22989
Andy Verinov
2003-04-17 00:09
2003.05.08
Вешается BDE от большого числа запросов?


14-23355
Andrey V.
2003-04-17 13:25
2003.05.08
Access violation


1-23073
maksimenkon
2003-04-25 17:18
2003.05.08
Как уменьшить картинку???


14-23339
Denich
2003-04-20 01:15
2003.05.08
????Ребят, как удалять Paramstr(0)????





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский