Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.01.2012, 19:59   #1
bizkitlimp
Пользователь
 
Регистрация: 17.03.2011
Сообщений: 12
По умолчанию Конверт Real числа в 6 байт

Здрасьте всем. Не баньте)
Интересует как конвертировать real число в 6 байт. Ну, типа как в WinHEX-е есть data interpreter. Вот хочу такой же своими руками, заминка случилась при конверте.

Вроде бы правильно конвертирует огромные числа(задом наперед правда байты получаются), а с малыми пропускает нули

345 должно быть 89 00 00 00 80 2C, моя функция пишет: 89 2C80 00 89
(если реверсировать то 89 00 802C, остальные нули где?)
Вообщем, может есть какая нибудь функция по конверту real? Только чтоб 6 байт, типа старый real. Заранее благодарю.

зы
И как сделать, чтобы байты НЕ задом наперед были?
зы
И тут один байт (первый) лишний всегда. Он повторяет последний при сообщении, это да, фигня))


Код:
procedure TFL_Form.Menu_OpenButtonClick(Sender: TObject);
var
f: file of byte;
a: array [0..5] of byte;
X: real48;
p : pChar;
begin
 AssignFile(F, ('123.exe'));
 Reset(f);
 Seek(F,$00);
 BlockRead(f,a,6);
 X:=Real48 (a);
 Edit1.Text:=FloattoStr(X);

 //Old real to 6 bytes (reversed)
 X:=strtofloat(Edit1.Text);
 p:=@X;
 ShowMessage(IntToHex(ord(p[3]),2)+' '+IntToHex(ord(p[2]),2)+' '+IntToHex(ord(p[1]),2)+' '+IntToHex(ord(p[0]),2)+' ');
bizkitlimp вне форума Ответить с цитированием
Старый 08.01.2012, 22:03   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

Читайте побайтно в массив в цикле с обратным отсчётом. Потом и преобразуйте в Real48. Куда пропадают нули не могу сказать... у меня, думаю, не пропали бы (особенно если отладкой пройтись)... надо смотреть по месту, так сказать
phomm вне форума Ответить с цитированием
Старый 08.01.2012, 22:13   #3
chertovich
Форумчанин
 
Аватар для chertovich
 
Регистрация: 26.07.2009
Сообщений: 489
По умолчанию

Код:
const
  Size = SizeOf(Real);
var
  Value: Real;
  Bytes: array [0..Size - 1] of Byte;
  I: Integer;
begin
  Move(Value, Bytes[0], Size);

  for I := 0 to Size - 1 do
    ShowMessage(IntToStr(Bytes[I]));
end;
Если в глубине души вы программист, то, следуя своим наклонностям, вы захотите написать кусок кода.
chertovich вне форума Ответить с цитированием
Старый 08.01.2012, 23:00   #4
bizkitlimp
Пользователь
 
Регистрация: 17.03.2011
Сообщений: 12
По умолчанию

chertovich,
так это double получается)
Код:
const
  Size = SizeOf(Real);
var
  Value: Real48;
  Bytes: array [0..5] of Byte;
  I: Integer;
  s:string;
begin
  Move(Value, Bytes[0], Size);

  for I := 0 to 5 do
    s:=s+(IntToStr(Bytes[I]));
    showmessage(s);
end;
Вот так поправил, вроде то что нужно. Опять же почти, но там коверкать не слишком сложно.

phomm, насчет нулей, при конверте числа в string, он не учитывает того, что мне хочется чтоб вместо одного нуля было два, как в winhex-e. Вот и нулей ровно в два раза меньше.

Спасибо короче всем)

Во! Идеальный вариант:
Код:
const
  Size = SizeOf(Real);
var
  Value: Real48;
  Bytes: array [0..5] of Byte;
  I: Integer;
  s:string;
begin
Value:=1234567;
Move(Value, Bytes[0], Size);
 
for I := 0 to 5 do
s1:=s1+(IntToHex(Bytes[I],2));
 showmessage(s1);

Последний раз редактировалось bizkitlimp; 08.01.2012 в 23:30.
bizkitlimp вне форума Ответить с цитированием
Старый 04.12.2012, 15:03   #5
Александр0999
Новичок
Джуниор
 
Регистрация: 04.12.2012
Сообщений: 1
По умолчанию

Цитата:
(если реверсировать то 89 00 802C, остальные нули где?)
Нули пропадают потому что ты ограничил их сам
вместо

Код:
IntToHex(ord(p[3]),2)
надо просто написать

Код:
IntToHex(ord(p[3]),4)
Александр0999 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти байт максимальным количестов единиц и байт с максмальным количеством нулей и разность (ассемблер) Beren42 Помощь студентам 0 15.12.2010 20:32
Конверт из 1С в Delphi Глупышка Помощь студентам 1 08.10.2007 15:07
как перевести из integer в real(и обратно), и из real в string(и обратно) Ga-sergey Общие вопросы Delphi 2 08.06.2007 21:13
Преобразование числа real к машинному виду Roman999 Общие вопросы Delphi 3 01.05.2007 22:36