Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.02.08;
Скачать: CL | DM;

Вниз

Чтение данных типа SINGLE из файла   Найти похожие ветки 

 
igan ©   (2008-12-23 10:30) [0]

Добрый день! Имеются файлы с разнородным содержимым (байты, строки, биты и вещественные числа типа 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.

Но не могу понять все равно. :(
Может есть у кого то нормальная формула или процедура (функция) по преобразованию?

Спасибо!


 
Рамиль ©   (2008-12-23 10:32) [1]

Открой TFileStream ом и читай сразу в переменные.


 
igan ©   (2008-12-23 10:45) [2]

хм. спасибо за совет. щас почитаю про этот TFileStream. раньше не приходилось пользоваться *удивление*


 
Сергей М. ©   (2008-12-23 10:49) [3]


> igan ©   (23.12.08 10:30)  


> биты


Как они там оказались ?
Минимальная адресуемая единица - байт !


 
igan ©   (2008-12-23 11:10) [4]

> Сергей М.
Ну, там после строковых данных идут подряд 840 дискретных сигналов, соотв. занимают 105 байт, дальше 98 аналоговых (типа single) вот собственно и все.

> Рамиль
TFileStream - то что нужно! спасибо еще раз :)


 
Германн ©   (2008-12-23 11:11) [5]


> igan ©   (23.12.08 10:45) [2]
>
> хм. спасибо за совет. щас почитаю про этот TFileStream.

Никакой  TFileStream тебе не поможет. Если у файла есть конкретная структура, так и читай файл в соответствии с ней. Если нет, то увы.


 
Сергей М. ©   (2008-12-23 11:15) [6]


> igan ©   (23.12.08 11:10) [4]


> 840 дискретных сигналов, соотв. занимают 105 байт


А если бы их было 839, то сколько они, по-твоему, занимали бы ?


 
igan ©   (2008-12-23 11:20) [7]

> Германн

все файлы имеют разную структуру
24 байта - заголовок (в том числе кол-во параметров)
далее названия параметров
00 01 00 ИМЯ001 00 01 00 ИМЯ002 00 01 00 ИМЯ003 .... - это однобитовые значения, далее
00 00 00 ИМЯ_N 00 00 00 ИМЯ_M ... b и т.д. это single, далее метка времени и сами значения, потом снова метка времени и т.д.


 
DVM ©   (2008-12-23 11:24) [8]


> igan ©   (23.12.08 10:30)
>
> Добрый день! Имеются файлы с разнородным содержимым (байты,
>  строки, биты и вещественные числа типа single (4 байта)).
>  

Нету там никаких строк, single и прочей лабуды.  Там есть байты. Это программа, которая будет читать должна так или иначе интерпретировать прочитанное.
Если структура файла известна, и скажем, первое значение предполагается integer, то вот и читай из файла 4 байта и клади в переменную типа integer. Если там хранится строка и известен ее размер, то выделяй память под строку PChar и читай в нее. И т.д.
Для чтения под Windows лучше все же пользоваться функциями Windows для работы с файлами, а не урезанными неявными обертками типа file of byte; и т.д.
Или  TFileStream


 
DVM ©   (2008-12-23 11:25) [9]


> igan ©   (23.12.08 11:20) [7]


> все файлы имеют разную структуру

так не бывает


 
DVM ©   (2008-12-23 11:28) [10]


> это однобитовые значения

1 бит ты все равно не прочитаешь и не запишешь, поэтому при записи биты вероятно группировались в байты, которые и надо читать.


 
igan ©   (2008-12-23 12:37) [11]

> DVM
> так не бывает

1. прислать? поверь, бывает. в моем проекте 16 разных файлов. А если писать прогу не только для себя, то таких проектов много по россии, и в каждом, конечно же, свои файлы.
2. естественно нужно читать байты, в которых по 8 параметров. это вообще не вопрос.
3. вопрос еще в формате записи времени. понятно, что в ms, но смещение?
84h F4h 83h - это 10:11:52
54h FСh 83h - это 10:11:54
Если вычесть, разница 2000 - 2 сек, но от какого момента начало счета?


 
igan ©   (2008-12-23 12:43) [12]

> DVM

сорри, не увидел первое сообщение.

> читай из файла 4 байта и клади в переменную типа integer
Это лучше делать с помощью TFileStream или как то еще можно?
Как "правильнее"?


 
igan ©   (2008-12-23 13:31) [13]

ругается, зараза...


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 13:34) [14]

ААА!!! Извиняюсь, сам дурак, все работает. Нужно -392 ! :)


 
Palladin ©   (2008-12-23 13:35) [15]

TStream.Seek + F1


 
Slym ©   (2008-12-23 13:36) [16]

igan ©   (23.12.08 11:20) [7]
00 01 00 ИМЯ001 00 01 00 ИМЯ002 00 01 00 ИМЯ003

сингла не увидел... похоже на строку в хексе


 
igan ©   (2008-12-23 19:15) [17]

> Slym
зачем ни о чем ответовопрос? тут я писал что перед ИМЕНЕМ параметра если 00 01 00 - то это дискретный / логический / булевый тип, а если 00 00 00 то типа single, и только после ИМЕН параметров идут собственно данные.

На сегодня все вопросы по чтению разнородных данных РЕШЕНЫ благодаря Рамилю за его конкретный и совершенно точный ответ.
Проблемы остались с форматом хранения временных меток ну и еще есть пара - тройка непонятных байт в заголовке, хотя можно и без них уже обойтись.
Еще раз всем спасибо. Если есть желание поразгадывать ребус со временем, завтра продолжим. С утра выложу более подробные данные.



Страницы: 1 вся ветка

Текущий архив: 2009.02.08;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.013 c
3-1214894986
zorik
2008-07-01 10:49
2009.02.08
Можна удалить записи только запросом, без хранимки?


2-1230044352
bioss
2008-12-23 17:59
2009.02.08
Алгоритм для выделенияслов из строки


6-1198580653
Lamer666
2007-12-25 14:04
2009.02.08
POST c авторизацией на WEB по HTTPS


2-1230103744
девушка
2008-12-24 10:29
2009.02.08
Как лучше осуществить обновления данных в формах?


15-1229320470
desc
2008-12-15 08:54
2009.02.08
FloatToStr