Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.02.08;
Скачать: [xml.tar.bz2];

Вниз

Чтение данных типа 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.007 c
15-1229184736
Baks
2008-12-13 19:12
2009.02.08
Помогите выбрать "игровой" компьютер


11-1197209759
nikfel
2007-12-09 17:15
2009.02.08
Запрет закрытия формы.


1-1207734351
9899100
2008-04-09 13:45
2009.02.08
TTreeView


6-1198218343
LexXL
2007-12-21 09:25
2009.02.08
проверить наличие файла на ftp


2-1230226466
HoBu4oK
2008-12-25 20:34
2009.02.08
paintbox





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский