Bud*_*Joe 6 .net binary file-format file binary-data
我需要能够以自定义二进制文件格式存储一些数据.我以前从未设计过自己的文件格式.它需要是一个友好的格式,用于在C#,Java和Ruby/Perl/Python世界之间旅行.
从文件开始将包含记录.GUID字段和JSON/YAML/XML数据包字段.我不确定用什么作为分隔符.逗号,制表符或换行符似乎太脆弱了.Excel做什么?还是XML前的OpenOffice格式?你应该使用ASCII字符0或1.不知道从哪里开始.有关该主题的任何文章或书籍?
该文件格式可以稍后扩展以包括"标题部分".
注意:首先,我将使用.NET,但我希望该格式易于移植.
更新:
"数据包"的处理可能很慢,但文件格式内的导航不能.所以我认为XML不在议事日程中.
看看使用"协议缓冲区"怎么样?设计为高效,可移植,版本容忍的通用二进制格式,它在谷歌库中提供C++,Java和Python,在社区端口提供 C#,Perl,Ruby和其他格式?
请注意,Guid没有特定的数据类型,但您可以将其作为(基本上)a的消息进行填充byte[].
通常对于.NET工作,我建议使用protobuf-net(但作为作者,我有点偏颇) - 但是,如果你打算以后使用其他语言,你可以使用Jon的dotnet-protobufs做得更好(长期); 这将为您提供跨平台的熟悉的API(其中 - protobuf-net使用.NET惯用法).
我将尝试添加一些创建可移植二进制文件格式的一般提示。
请注意,发明二进制文件格式意味着记录其中的各个位必须如何排列以及它们的含义。这不是编码,而是文档。
现在提示:
决定如何处理字节序。好的、简单的方法就是一劳永逸地做出决定。当在普通 PC(即 x86)上使用时,最好选择小端字节序,以节省转换(性能)。
创建标头. 是的,总是有一个标题是个好主意。文件的第一个字节应该能够告诉您,您正在使用什么格式。
最后,添加数据。现在,数据的格式将是特定的,并且始终基于您的确切需求。基本上,数据将存储在某种数据结构的二进制图像中。数据结构是您需要提出的。
如果您需要通过某种索引随机访问数据,B 树是不错的选择,而如果您只需要大量数字来写入所有数据,然后读取它们,则“数组”即可解决问题。
此外,您可以使用TLV(类型-长度-值)概念来实现前向兼容性。