|
Вопрос # 3 978/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
Очень интересует следующий вопрос:
Можно ли вытащить переменную какого-либо типа, превышающего один байт, в виде последовательности байтов, как она хранится в памяти? А так же, проще всего вытащить значение переменной из ее шестнадцатиричного вида? Заранее благодарен!
 |
Вопрос задал: 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 (статус: 2-ой класс), 5 апреля 2010, 13:11 [#1]:
ну и почему отрицательное мнение, что плохого я спросил?
|
|
min@y™ (статус: Доктор наук), 5 апреля 2010, 13:14 [#2]:
Всё, что хранится в памяти, можно прочитать и даже изменить.
Давай, колись, для чего тебе это понадобилось.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
webkent (статус: 2-ой класс), 5 апреля 2010, 13:20 [#3]:
=))
Это по работе, мне тут надо из файла считывать значения, они там хранятся в Hex формате, так же туда надо их записывать. Есть программка Hex Workshop - она конвертирует в любые форматы, так вот мне как раз и нужны либо эти алгоритмы преобразований, либо(что даже лучше) может есть готовые способы получить 16-ричное представление переменных и ничего не высчитывать?
|
|
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 (статус: 2-ой класс), 5 апреля 2010, 13:48 [#5]:
файл не текстовый, блокнотом там крякозябры, открываю с помощью WinHex.
IntToHex спасибо, есть ли похожий способ для float, ASCII?
|
|
min@y™ (статус: Доктор наук), 5 апреля 2010, 14:16 [#6]:
Так, понятно, файл двоичный.
Что тебе из него нужно прочитать и где отобразить?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
webkent (статус: 2-ой класс), 5 апреля 2010, 14:18 [#7]:
Я его полностью как array of byte уже прочитал, мне надо из него взять определенные байти и из них сформировать float число, которое они обозначают. И так же своё float число перевести в набор байтов и записать в этот самый массив. Проблема в конвертировании Array <-=-> Float
|
|
min@y™ (статус: Доктор наук), 5 апреля 2010, 14:54 [#8]:
Во-первых, в array of byte читать файл - ацтой. Для этих целей есть TFileStream.
Чтобы извлечь float-число из массива или TFileStream, надо знать его тип (который ты мне до сих пор не сказал).
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
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] ;
// Отправили результат
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|