Форум: "Начинающим";
Текущий архив: 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.006 c