在处理文本数据时,我使用了优秀的FileHelpers库。它允许我非常轻松地将文本字段从文件或内存中的字符串转储到表示数据的类中。
在使用基于大端微控制器的系统时,我需要读取串行数据流。为了节省非常有限的微控制器平台上的空间,我需要编写原始二进制数据,其中包含各种多字节类型的字段(基本上只是将一个结构变量转储出串口)。
我喜欢FileHelpers的架构。我创建了一个表示数据的类,并使用属性来标记它,该属性告诉引擎如何将数据放入类中。我可以向引擎提供表示单个记录的字符串,并获得数据的反序列化表示。但是,这与对象序列化的不同之处在于原始数据不以任何方式分隔,它是一种简单的二进制固定记录格式。
FileHelpers可能不适合读取这样的二进制数据,因为它无法处理显示的空值和 *我怀疑可能存在unicode问题(引擎将输入作为字符串,所以我必须从串口读取字节并在它们进入我的数据转换器类之前将它们转换为unicode字符串)。作为一个实验,我已经设置它来读取二进制流和,只要我小心不发送空值它到目前为止工作得很好。很容易设置新的转换器来读取原始数据并解决endian foratting问题等问题。它当前在null上失败,而无法处理多条记录(它希望记录之间有CRLF)。
我想知道的是,是否有人知道开源库与FileHelpers类似,但设计用于处理二进制数据。
我正在考虑从FileHelpers中获取一些东西来处理这个任务,但似乎应该有一些东西可以做到这一点。
*事实证明它并没有抱怨输入流中的空值。我的测试程序中出现了一个无关的错误,我想到了null的问题。应该先调查一下!
答案 0 :(得分:0)
我没有使用过filehelpers,所以我不能直接比较;但是,如果您有一个代表您的对象的对象模型,您可以尝试protobuf-net;它是使用Google紧凑的“协议缓冲区”有线格式的.NET的二进制序列化引擎。比xml更有效,但不需要编写所有自己的序列化代码。
请注意,“协议缓冲区” 在字段之间包含一些非常简洁的标记(通常是一个字节);这会添加 little 填充,但会大大提高版本容差。对于“打包”数据(即,例如来自阵列的整数块),如果需要,可以省略它。
所以:如果你只想要一个紧凑的输出,它可能会很好。如果您需要特定输出,可能不那么。
披露:我是作者,所以我有偏见;但它是免费的。
答案 1 :(得分:0)
当我在SIRFstarIII二进制模式中摆弄GPS数据时,我使用带有串行模块的Python交互式提示从USB /串口获取流,并struct module根据需要转换字节(按照SIRF定义的某种格式)。使用交互式提示非常灵活,因为我可以将字符串读取到变量,处理它,查看结果并在需要时再试一次。原型设计阶段完成后,我需要将数据格式字符串放入最终程序中。
您的问题没有提及任何有关C#标记的原因。我理解FileHelpers是一个C#库,但我并没有告诉我你在使用什么环境。有一个名为IronPython的Python for .NET实现。
我意识到这个答案可能意味着你必须学习一门新语言,但是对于任何程序员来说,拥有一个交互式提示是一个非常强大的工具。