Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> HexToSingle, Как перевести Hex в Single 
V
    Опции темы
sevlad
  Дата 10.1.2007, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 10.1.2007

Репутация: нет
Всего: нет



столкнулся с проблемой, что при чтении из файла в массив типа Char или Byte и последующей его обработкой необходимо преобразовать 4 последовательных байта в single. Бъюсь 4 дня. Знаю, что должно быть просто но ... smile  Пробывал record с двумя параметрами, первый word, второй single, на основе которого создавал массив и, что интересно, вроде структура должна занимать 6 байт в памяти, а показывает, что 8. Из-за этого собственно все и началось. При чтении данных по 2 (word) и 4 (single) байта все преобразуется правильно. smile 
PM MAIL   Вверх
Snowy
Дата 10.1.2007, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Код

var
  ba: array[0..3] of byte;
  s:  single;
begin
  ...
  s := ba[3] + ba[2] shl 8 + ba[1] shl 16 + ba[0] shl 24;


Добавлено @ 23:42 
Цитата(sevlad @  10.1.2007,  23:18 Найти цитируемый пост)
вроде структура должна занимать 6 байт в памяти, а показывает, что 8
Это из-за выравнивания. Чтобы его не было, нужно использовать packed record.
PM MAIL   Вверх
Beltar
Дата 11.1.2007, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 3
Всего: 7



2 Snowy:

Хм-м. А что происходит если к байту применить сдвиг на 16 или 24 бит?

Однажды мне понадобилось слеплять Float aka Single из приходящего с девайса потока байтов по протоколу ModBus в котором вещественное представляется с перестановкой байтов. Кажется это формат процессоров Motorola.
Я не мудрствуя лукаво сделал так. smile

Код

function ModBusByteToFloat(m:Mas4Bytes):Single;
var pRes:Pointer;
begin
pRes:=@Result;
PByte(pRes)^:=m[2];
PByte(Integer(pRes)+1)^:=m[1];
PByte(Integer(pRes)+2)^:=m[4];
PByte(Integer(pRes)+3)^:=m[3];
end;



--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Snowy
Дата 11.1.2007, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Тоже вариант.
Но наиболее быстрым тут будет вариантный packed record
Код
MyRec = packed record
  case integer of:
    0: ba: array[0..3] of byte;
    1: s:    single;
  end;

PM MAIL   Вверх
Beltar
Дата 11.1.2007, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 3
Всего: 7



Это да, у меня немного более сложный случай, кстати, мой тогдашний начальник такую задачу в свое время решал на ассемблере. smile 
Кстати, здесь старинный китайский вопрос может возникнуть "анахуа?"

Если байты уже лежат как нужно, то что мешает:
Код

var s:Single;
//...
FileStream.Read(S,4);


Тут надо сам алгоритм смотреть, вдруг там можно и без массива обойтись. smile


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
sevlad
Дата 11.1.2007, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 10.1.2007

Репутация: нет
Всего: нет



Спасибо за подсказки.

Цитата(Snowy @  10.1.2007,  23:40 Найти цитируемый пост)
Это из-за выравнивания. Чтобы его не было, нужно использовать packed record. 

Это я понял. как опробую поделюсь.

А насчет

Цитата(Beltar @  11.1.2007,  12:42 Найти цитируемый пост)
Кстати, здесь старинный китайский вопрос может возникнуть "анахуа?"


да, все лежит как надо, и в случае побатного считывания проблем нет, но файл более 200 метров и время уходит ~10 мин на обработку одного параметра, а их там ~700, а надо ~ 10-20 сек. Так вот.
PM MAIL   Вверх
sevlad
Дата 12.1.2007, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 10.1.2007

Репутация: нет
Всего: нет



Спасибо всем за помощь. smile 
В итоге получилось так:
Код

type ParamFloat=packed record
  Index:word;
  Value:single;
end;

****************************

var
CurParamFloat: array[1..50000] of ParamFloat;

****************************

BlockRead(InputFile,CurParamFloat,300000);


Хотелось бы читать все в динамический массив, но пока увы.

Отдельное спасибо Snowy 
Совет про paked record оказался правильным.

Итог: время обработки 200 метрового файла по одному параметру составляет 7 секунд. Приемлимо.

Это сообщение отредактировал(а) sevlad - 12.1.2007, 20:45
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0474 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.