| 
| 
 | Вопрос # 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] ;
 // Отправили результат
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |