Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 978

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!

Очень интересует следующий вопрос:
Можно ли вытащить переменную какого-либо типа, превышающего один байт, в виде последовательности байтов, как она хранится в памяти? А так же, проще всего вытащить значение переменной из ее шестнадцатиричного вида? Заранее благодарен!

webkent Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: webkent (статус: 2-ой класс)
Вопрос отправлен: 5 апреля 2010, 12:54
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: min@y™

Мой тебе совет: выкинь File of Byte и свой дин. массив. Читай через TFileStream.
Чой-та я не нахожу у себя типа float, зато вижу тип Single (1.5 x 10^-45 .. 3.4 x 10^38), который занимает 4 байта. Чтобы прочитать значение из массива:

var
  X: array of Byte;
  Y: Single;
  Z: Cardinal;
begin
  // <------- Чтение файла в массив Х
  Move(X[смещение], Y, SizeOf(Y));
  Label1.Caption:= FloatToStr(Y); // Вывод значения с плав. точкой
  Move(Y, Z, SizeOf(Y)); // Копирование в другой тип
  Label2.Caption:= '0x' + IntToHex(Z, SizeOf(Y) * 2); // Вывод 4х байтов в 16-ричном виде
end;

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 5 апреля 2010, 15:27
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 10; последнее сообщение — 5 апреля 2010, 21:21; участников в обсуждении: 3.
webkent

webkent (статус: 2-ой класс), 5 апреля 2010, 13:11 [#1]:

ну и почему отрицательное мнение, что плохого я спросил?
min@y™

min@y™ (статус: Доктор наук), 5 апреля 2010, 13:14 [#2]:

Всё, что хранится в памяти, можно прочитать и даже изменить.
Давай, колись, для чего тебе это понадобилось.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
webkent

webkent (статус: 2-ой класс), 5 апреля 2010, 13:20 [#3]:

=))
Это по работе, мне тут надо из файла считывать значения, они там хранятся в Hex формате, так же туда надо их записывать. Есть программка Hex Workshop - она конвертирует в любые форматы, так вот мне как раз и нужны либо эти алгоритмы преобразований, либо(что даже лучше) может есть готовые способы получить 16-ричное представление переменных и ничего не высчитывать?
min@y™

min@y™ (статус: Доктор наук), 5 апреля 2010, 13:36 [#4]:

Цитата (webkent):

мне тут надо из файла считывать значения, они там хранятся в Hex формате

Файл текстовый?

Цитата (webkent):

может есть готовые способы получить 16-ричное представление переменных и ничего не высчитывать?

var
  X: Cardinal;
begin
  X:= 100500;
  Label1.Caption:= '0x' + IntToHex(X, 8);
end;
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
webkent

webkent (статус: 2-ой класс), 5 апреля 2010, 13:48 [#5]:

файл не текстовый, блокнотом там крякозябры, открываю с помощью WinHex.
IntToHex спасибо, есть ли похожий способ для float, ASCII?
min@y™

min@y™ (статус: Доктор наук), 5 апреля 2010, 14:16 [#6]:

Так, понятно, файл двоичный.
Что тебе из него нужно прочитать и где отобразить?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
webkent

webkent (статус: 2-ой класс), 5 апреля 2010, 14:18 [#7]:

Я его полностью как array of byte уже прочитал, мне надо из него взять определенные байти и из них сформировать float число, которое они обозначают. И так же своё float число перевести в набор байтов и записать в этот самый массив. Проблема в конвертировании Array <-=-> Float
min@y™

min@y™ (статус: Доктор наук), 5 апреля 2010, 14:54 [#8]:

Во-первых, в array of byte читать файл - ацтой. Для этих целей есть TFileStream.
Чтобы извлечь float-число из массива или TFileStream, надо знать его тип (который ты мне до сих пор не сказал).
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
webkent

webkent (статус: 2-ой класс), 5 апреля 2010, 15:05 [#9]:

Читаю я через File of Byte это потом я уже переношу всё в массив.
Тип числа Float, размер-4 байта(два слова), число с плавающей запятой от -3.4*10^38 до 3.4*10^38.
Толяныч

Толяныч (статус: 4-ый класс), 5 апреля 2010, 21:21 [#10]:

А зачем вообще преобразовывать в HEX? Если надо принять 4-байтовое float,что-то с ним сделать и отправить в другое ( или в то то же ) место,можно положиться на компутер, лучше его вручную не сделаешь :-) При необходимости посмотреть ( распечатать ) полученное float число лучше это делать в привычном виде вроде 3.14E26 без всяких hex-ов.
Приведенный пример справедлив, если файл, из которого получены float данные, сделан на PC-совместимом компе, а не на какой-нибудь ЕС-1035.


// Проверено на 32-битной версии, если нужно для 64-битной, то надо посмотреть.

type
RC = record
case flag : byte of
0 : ( flt : single ) ;
1 : ( byt : array[0..7] of byte ) ;
end ;
. . . . . . . . . . .
var
bytflt : RC ;

. . . . . . . . . . .
Процедура
. . . . . . . . . . .

// Приняли что-то из файла в байтовый массив BytArray


for i := 0 to 7 do if (i<3) or (i>6) then bytflt.byt[i] := BytArray[i+k-3] else bytflt.byt[i] := 0 ;
// Выделили в 4 байтах исходного массива, начиная с к-й позиции, single float и расширили его до double

bytflt.flt := . . . . .
// Сделали, что хотели с плавающим числом bytflt.flt

k := . . . .
// Определились, куда отправим результат

for i := 0 to 3 do BytArray[i+k] := bytflt.byt[i+3] ;
// Отправили результат

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:51
Выполнено за 0.03 сек.