![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Чтение данных типа SINGLE из файла [D3, XP]
igan © (2008-12-23 10:30:00)Добрый день! Имеются файлы с разнородным содержимым (байты, строки, биты и вещественные числа типа single (4 байта)). Поэтому объявляю файл как : file of byte;
Застопорился на том, что не понимаю, как преобразовать зачения типа single в нормальное число. Нашел вот это:
1)
Формат машинного представления данных типа SINGLE следующий:
мл. байт ст. байт
7 0 15 8 23 22 16 31 30 24 - номера разрядов памяти
м....м м....м х м...м s х...х
-16 -23 -8 -15 0 -1 -7 7 1 - показатели степеней разрядов
мантиссы и характеристики
где:
s - знаковый разряд,
х - характеристика числа,
м - нормализованная мантисса.
и это :
2)
Четырехбайтовое (32-битовое) число типа Single подразделяет-
ся на три поля:
1 8 23
+---+------+-------..---------+
| s | e | f |
+---+------+-------..---------+
msb lsb msb lsb
Значение v этого числа определяется с помощью выражений:
if 0 < e < 255, then v = (-1)^s * 2^(e-12) * (l.f).
if e = 0 and f <> 0, then v = (-1)^s * 2^(126) * (o.f).
if e = 0 and f = 0, then v = (-1)^s * O.
if e = 255 and f = 0, then v = (-1)^s * Inf.
if e = 255 and f <> 0, then v = NaN.
Но не могу понять все равно. :(
Может есть у кого то нормальная формула или процедура (функция) по преобразованию?
Спасибо!
igan (2008-12-23 19:15:00) [1]> Slym
зачем ни о чем ответовопрос? тут я писал что перед ИМЕНЕМ параметра если 00 01 00 - то это дискретный / логический / булевый тип, а если 00 00 00 то типа single, и только после ИМЕН параметров идут собственно данные.
На сегодня все вопросы по чтению разнородных данных РЕШЕНЫ благодаря Рамилю за его конкретный и совершенно точный ответ.
Проблемы остались с форматом хранения временных меток ну и еще есть пара - тройка непонятных байт в заголовке, хотя можно и без них уже обойтись.
Еще раз всем спасибо. Если есть желание поразгадывать ребус со временем, завтра продолжим. С утра выложу более подробные данные.
Slym (2008-12-23 13:36:00) [2]igan © (23.12.08 11:20) [7]
00 01 00 ИМЯ001 00 01 00 ИМЯ002 00 01 00 ИМЯ003
сингла не увидел... похоже на строку в хексе
Palladin (2008-12-23 13:35:00) [3]TStream.Seek + F1
igan (2008-12-23 13:34:00) [4]ААА!!! Извиняюсь, сам дурак, все работает. Нужно -392 ! :)
igan (2008-12-23 13:31:00) [5]ругается, зараза...
procedure TfmMain.btOpenClick(Sender: TObject);
var
vAnlg : single;
Stream : TFileStream;
Pos : LongInt;
i : integer;
begin
if not OD1.Execute then exit;
vAnlg := 0;
Stream := TFileStream.Create(OD1.FileName, fmOpenRead);
try
Pos := Stream.Seek(392, soFromEnd);
for i := 0 to 97 do begin
Stream.ReadBuffer(vAnlg, 4); -> сразу же ошибка чтения
Memo1.Lines.Add(FloatToStr(vAnlg));
end;
finally
Stream.Free;
end;
end;
igan (2008-12-23 12:43:00) [6]> DVM
сорри, не увидел первое сообщение.
> читай из файла 4 байта и клади в переменную типа integer
Это лучше делать с помощью TFileStream или как то еще можно?
Как "правильнее"?
igan (2008-12-23 12:37:00) [7]> DVM
> так не бывает
1. прислать? поверь, бывает. в моем проекте 16 разных файлов. А если писать прогу не только для себя, то таких проектов много по россии, и в каждом, конечно же, свои файлы.
2. естественно нужно читать байты, в которых по 8 параметров. это вообще не вопрос.
3. вопрос еще в формате записи времени. понятно, что в ms, но смещение?
84h F4h 83h - это 10:11:52
54h FСh 83h - это 10:11:54
Если вычесть, разница 2000 - 2 сек, но от какого момента начало счета?
DVM (2008-12-23 11:28:00) [8]
> это однобитовые значения
1 бит ты все равно не прочитаешь и не запишешь, поэтому при записи биты вероятно группировались в байты, которые и надо читать.
DVM (2008-12-23 11:25:00) [9]
> igan © (23.12.08 11:20) [7]
> все файлы имеют разную структуру
так не бывает
DVM (2008-12-23 11:24:00) [10]
> igan © (23.12.08 10:30)
>
> Добрый день! Имеются файлы с разнородным содержимым (байты,
> строки, биты и вещественные числа типа single (4 байта)).
>
Нету там никаких строк, single и прочей лабуды. Там есть байты. Это программа, которая будет читать должна так или иначе интерпретировать прочитанное.
Если структура файла известна, и скажем, первое значение предполагается integer, то вот и читай из файла 4 байта и клади в переменную типа integer. Если там хранится строка и известен ее размер, то выделяй память под строку PChar и читай в нее. И т.д.
Для чтения под Windows лучше все же пользоваться функциями Windows для работы с файлами, а не урезанными неявными обертками типа file of byte; и т.д.
Или TFileStream
igan (2008-12-23 11:20:00) [11]> Германн
все файлы имеют разную структуру
24 байта - заголовок (в том числе кол-во параметров)
далее названия параметров
00 01 00 ИМЯ001 00 01 00 ИМЯ002 00 01 00 ИМЯ003 .... - это однобитовые значения, далее
00 00 00 ИМЯ_N 00 00 00 ИМЯ_M ... b и т.д. это single, далее метка времени и сами значения, потом снова метка времени и т.д.
Сергей М. (2008-12-23 11:15:00) [12]
> igan © (23.12.08 11:10) [4]
> 840 дискретных сигналов, соотв. занимают 105 байт
А если бы их было 839, то сколько они, по-твоему, занимали бы ?
Германн (2008-12-23 11:11:00) [13]
> igan © (23.12.08 10:45) [2]
>
> хм. спасибо за совет. щас почитаю про этот TFileStream.
Никакой TFileStream тебе не поможет. Если у файла есть конкретная структура, так и читай файл в соответствии с ней. Если нет, то увы.
igan (2008-12-23 11:10:00) [14]> Сергей М.
Ну, там после строковых данных идут подряд 840 дискретных сигналов, соотв. занимают 105 байт, дальше 98 аналоговых (типа single) вот собственно и все.
> Рамиль
TFileStream - то что нужно! спасибо еще раз :)
Сергей М. (2008-12-23 10:49:00) [15]
> igan © (23.12.08 10:30)
> биты
Как они там оказались ?
Минимальная адресуемая единица - байт !
igan (2008-12-23 10:45:00) [16]хм. спасибо за совет. щас почитаю про этот TFileStream. раньше не приходилось пользоваться *удивление*
Рамиль (2008-12-23 10:32:00) [17]Открой TFileStream ом и читай сразу в переменные.