FileHelpers-подобная утилита импорта / экспорта данных для двоичных данных?

2

Я использую отличную библиотеку FileHelpers, когда я работаю с текстовыми данными. Это позволяет мне легко сбрасывать текстовые поля из файла или строки в памяти в класс, представляющий данные.

При работе с большой системой на базе микроконтроллера мне нужно прочитать поток последовательных данных. Чтобы сэкономить место на очень ограниченной платформе микроконтроллера, мне нужно написать необработанные двоичные данные, содержащие поле различных многобайтовых типов (по сути, просто сбрасывание структурной переменной из последовательного порта).

Мне нравится архитектура FileHelpers. Я создаю класс, представляющий данные, и помечаю его атрибутами, которые сообщают движку, как помещать данные в класс. Я могу передать движок строку, представляющую одну запись, и получить десериализованное представление данных. Однако это отличается от сериализации объектов тем, что необработанные данные не ограничены каким-либо образом, это простой бинарный фиксированный формат записи.

FileHelpers, вероятно, не подходит для чтения таких двоичных данных, как , он не может обрабатывать нули, которые отображаются, и * Я подозреваю, что могут быть проблемы с unicode (двигатель принимает ввод как строку, поэтому я должны прочитать байты из последовательного порта и перевести их в строку юникода, прежде чем перейти к моим классам конвертеров данных). В качестве эксперимента я установил его для чтения двоичного потока и , пока я стараюсь не отправлять nulls, пока он работает довольно хорошо. Легко настроить новые преобразователи, которые читают необработанные данные и учетные записи для проблем, связанных с выпуском Endian. В настоящее время не работает с ошибками, а не может обрабатывать несколько записей (он ожидает CRLF между записями).

Я хочу знать, знает ли кто-нибудь об открытой библиотеке, которая работает аналогично FileHelpers, но предназначена для обработки двоичных данных.

Я рассматриваю возможность получения чего-то из FileHelpers для решения этой задачи, но похоже, что для этого нужно что-то уже доступное.

* Оказывается, он не жалуется на нули во входном потоке. У меня была несвязанная ошибка в моей тестовой программе, которая возникла там, где я ожидал проблемы с нулями. Должен был сначала изучить немного глубже!

Теги:
serialization
binary
microcontroller
filehelpers

2 ответа

0
Лучший ответ

Я не использовал filehelpers, поэтому я не могу провести прямое сравнение; однако, если у вас есть объектная модель, представляющая ваши объекты, вы можете попробовать protobuf-net; это двоичный механизм сериализации для .NET с использованием формата данных "compact buffer protocol" в формате Google. Гораздо эффективнее, чем такие, как xml, но без необходимости писать весь собственный код сериализации.

Обратите внимание, что "буферы протокола" содержат некоторые очень тонкие маркеры между полями (обычно один байт); это добавляет немного дополнений, но значительно улучшает переносимость версии. Для "упакованных" данных (т.е. Блоков из int, скажем, из массива) это может быть опущено при желании.

Итак: если вы просто хотите компактный выход, это может быть хорошо. Если вам нужен специфический вывод, возможно, меньше.

Раскрытие информации: Я автор, поэтому я предвзято; но это бесплатно.

  • 0
    Похоже, это может быть идеальным решением, если код для генерации данных очень легкий. Я работаю с Arduino, платформой на основе микроконтроллера AVR с объемом хранения всего несколько килобайт, поэтому пространство - это главное. В настоящее время я просто выкидываю структуру из последовательного порта без форматирования, поэтому накладные расходы минимальны. Любая идея в настоящее время большие библиотеки C ++ Protocol Buffers, и если они могут быть скомпилированы в 8-битной среде?
  • 0
    В настоящий момент я считаю, что рекомендуется использовать версию C для сценариев с ограниченным пространством, но новая более тонкая версия находится в стадии разработки: groups.google.com/group/protobuf/browse_thread/thread/… . Это может все еще быть слишком большим для этого, хотя; Я, честно говоря, не знаю. И 8 бит это ... сложно. Я подозреваю "нет", к сожалению. Сожалею.
0

Когда я возился с данными GPS в двоичном режиме SIRFstarIII, я использую интерактивную подсказку Python с последовательным модулем для извлечения потока из USB/последовательного порта и struct module для преобразования байтов по мере необходимости (для каждого формата, определенного SIRF). Использование интерактивного приглашения очень гибко, потому что я могу читать строку переменной, обрабатывать ее, просматривать результаты и повторять попытку, если это необходимо. После того, как этап прототипирования закончен, у меня есть строки формата данных, которые мне нужно внести в финальную программу.

В вашем вопросе ничего не говорится о том, почему у вас есть тег С#. Я понимаю, что FileHelpers - это библиотека С#, но я не говорю, в какой среде вы работаете. Существует реализация Python для .NET, называемая IronPython.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню