2

当我处理文本数据时,我使用了出色的 FileHelpers 库。它允许我非常轻松地将文本字段从文件或内存中的字符串转储到代表数据的类中。

在使用基于大端微控制器的系统时,我需要读取串行数据流。为了在非常有限的微控制器平台上节省空间,我需要编写原始二进制数据,其中包含各种多字节类型的字段(本质上只是将结构变量转储出串行端口)。

我喜欢 FileHelpers 的架构。我创建了一个代表数据的类,并用属性标记它,告诉引擎如何将数据放入类中。我可以为引擎提供一个表示单个记录的字符串,并获得数据的反序列化表示。但是,这与对象序列化的不同之处在于原始数据没有以任何方式分隔,它是一种简单的二进制固定记录格式。

FileHelpers 可能不适合读取此类二进制数据,因为它无法处理出现的空值并且* 我怀疑可能存在 unicode 问题(引擎将输入作为字符串,所以我必须从串行端口读取字节并翻译在它们进入我的数据转换器类之前将它们转换为 unicode 字符串)。作为一个实验,我已经将它设置为读取二进制流,只要我小心不发送空值,到目前为止它工作得很好。很容易设置新的转换器来读取原始数据并解决字节序格式化问题等。它目前在 null 上失败并且无法处理多个记录(它期望记录之间有 CRLF)。

我想知道的是,是否有人知道与 FileHelpers 类似但旨在处理二进制数据的开源库。

我正在考虑从 FileHelpers 派生一些东西来处理这个任务,但似乎应该已经有一些东西可以做到这一点。

*事实证明,它不会抱怨输入流中的空值。我的测试程序中有一个不相关的错误,我预计空值会出现问题。应该先深入调查一下!

4

2 回答 2

0

我没有使用过filehelpers,所以无法直接比较;但是,如果您有一个代表您的对象的对象模型,您可以尝试protobuf-net;它是一个用于 .NET 的二进制序列化引擎,使用 Google 的紧凑型“协议缓冲区”有线格式。比 xml 之类的东西效率更高,但不需要编写所有自己的序列化代码。

请注意,“协议缓冲区”确实在字段之间包含一些非常简洁的标记(通常是一个字节);这增加了一点填充,但大大提高了版本容差。对于“打包”数据(例如,来自数组的整数块),如果需要,可以将其省略。

所以:如果你只想要一个紧凑的输出,它可能会很好。如果您需要特定的输出,则可能更少。

披露:我是作者,所以我有偏见;但它是免费的。

于 2009-07-27T08:00:56.470 回答
0

当我在 SIRFstarIII 二进制模式下摆弄 GPS 数据时,我使用 Python 交互式提示和串行模块从 USB/串行端口获取流,并使用struct 模块根据需要转换字节(根据 SIRF 定义的某些格式)。使用交互式提示非常灵活,因为我可以将字符串读取到变量中,对其进行处理,查看结果并在需要时重试。原型阶段完成后,我有了需要放入最终程序的数据格式字符串。

你的问题没有提到为什么你有一个 C# 标签。我知道 FileHelpers 是一个 C# 库,但我并没有告诉我你在什么环境中工作。有一个用于 .NET 的 Python 实现,称为IronPython

我意识到这个答案可能意味着您必须学习一门新语言,但是对于任何程序员来说,拥有交互式提示都是一个非常强大的工具。

于 2009-07-30T12:09:40.280 回答