Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

чем считать данные из специфического *.dat файла?

81K
29 мая 2012 года
mr.dns
6 / / 29.05.2012
В общем задача следующая: есть реально существующий измерительный прибор, АЦП которого выдает файлы *.dat формата. В файле - набор чисел, каждое из которых по 13 бит и 14-й бит разделительный. числа формата знаковых целых. То бишь, так как для чисел используется не 16 бит двух байтов, то диапазон лежит в пределах -8193 до 8192 (где-то =) ). И у меня не получается их корректно считать (хотя советовали функцией fread). У fread в параметрах указывается размер данных и их количество (которое можно в принципе предположить), но все равно функция возвращает в буфер неведомые числа, далеко выходящие за вверенные рамки. Хочу спросить у опытных, может есть другой способ чтения файлов (настраиваемый), помимо fread?
414
29 мая 2012 года
CassandraDied
763 / / 24.05.2012
Хочешь прочесть именно 13-14 бит? Не получится. Читай байтами. Другого способа нет.
Ничего предполагать не нужно, если файл заполнен только этими значениями, читай до feof.
Интервал -4096..4095.
2.1K
29 мая 2012 года
disputant
95 / / 28.05.2007
Вы не забыли, что fread минимально умеет читать только байт? Т.е. считанные данные вы должны потом разбить на 14-битовые кусочки, выбросить 14-й бит, поместить 13 оставшихся битов в переменную и только потом с ней работать...
81K
29 мая 2012 года
mr.dns
6 / / 29.05.2012
Цитата: disputant
Вы не забыли, что fread минимально умеет читать только байт? Т.е. считанные данные вы должны потом разбить на 14-битовые кусочки, выбросить 14-й бит, поместить 13 оставшихся битов в переменную и только потом с ней работать...


Только как это сделать? я не нашел пока метода чтобы вытягивать 13-байтные числа из массива символов..

414
29 мая 2012 года
CassandraDied
763 / / 24.05.2012
Схема простая:
Цитата:

8 6
2 8 4
4 8 2
6 8
8 6


Одно число - один байт, вернее, количество битов, которые из него нужно достать. Как видно, схема повторяется для каждых 10ти байтов. То есть, достаточно запрограммировать извлечение 4х чисел из первых 10ти байт, а все остальные получать в цикле. Использовать для этого можно логические сдвиги и логические операции с битами.

2.1K
29 мая 2012 года
disputant
95 / / 28.05.2007
Цитата: mr.dns

Только как это сделать? я не нашел пока метода чтобы вытягивать 13-байтные числа из массива символов..



Руками :)
Проще всего - блоками по 7 байт (56 бит). Это - четыре 14-битовых поля.
Чтоб не думать - выставляем выравнивание на байт, и пишем структуру типа

 
Код:
struct data {
        short int i0: 13;
        char        : 1;
        short int i1: 13;
        char        : 1;
        short int i2: 13;
        char        : 1;
        short int i3: 13;
        char        : 1;
};
и вытягиваем из 7-байтового блока 4 числа. Если, конечно, у вас прибор little-endian - иначе надо еще немного повозиться...

То, что вам написали про 10-байтовый блок - ошибка, блок таки 7-байтовый, что видно даже из приведенной автором комментария про 10-байтовый блок схемы.
81K
29 мая 2012 года
mr.dns
6 / / 29.05.2012
Цитата: disputant
[quote=mr.dns;82856]
и вытягиваем из 7-байтового блока 4 числа. Если, конечно, у вас прибор little-endian - иначе надо еще немного повозиться...



Прибора в глаза не видел. У меня есть только *.dat файлы. =)

Чтож, сажусь писать код.
Я так понимаю, вопросы теперь буду писать на сайте, ибо ответы довольно оперативные, а сделать нужно до завтра.)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог