在说什么之前我不得不说,尽管我是一名经验丰富的Java程序员,但我还不熟悉C / C ++编程。
我必须以一种格式保存二进制文件,使其可以从不同的操作系统访问。平台。它应该非常有效,因为我必须处理大量数据。我应该采取什么方法进行调查?主要优点和缺点是什么?
答案 0 :(得分:6)
Network order(big-endian)是事实上的标准。但是,如果您的程序主要用于x86(这是小端),您可能会因为性能原因而坚持使用该程序(该协议仍可在大端机器上使用,但它们将改为有性能影响。)
除htonl(转换32位值)外,还有htons(16位)和bswap_64(64位非标准)。
如果您想要二进制格式,但是您希望抽象出一些细节以简化序列化和反序列化,请考虑Protocol Buffers或Thrift。协议缓冲区是可更新的(您可以向架构添加可选或重复(0或更多)字段,而不会破坏现有代码);不确定Thrift。
但是,在过早优化之前,请考虑解析是否真的是瓶颈。如果读取文件的每一行都需要数据库查询或计算,那么您可以使用更易读的格式,而不会对性能产生任何明显的影响。
答案 1 :(得分:2)
我认为这类任务有两个不错的选择。
在大多数情况下,我的第一选择可能是Sun(现在是甲骨文)的XDR。它在Sun的RPC实现中使用,所以它经过了相当长时间的严格测试。它在RFC 1832中定义,因此文档广泛可用。还有libraries(便携式和otherwise)知道如何转换为此格式/从此格式转换。线上表示相当紧凑,转换效率相当高。
XDR的一个巨大潜在问题是你确实需要知道数据代表什么来解码它 - 也就是说,你必须(通过一些外部手段)确保发送者和接收者同意(例如)定义他们将通过电线发送的结构,接收器可以(轻松)了解发送的内容。
如果您需要创建一个完全自我描述的流,那么有人可以根据流本身的内容找出它包含的内容,那么您可能会考虑ASN.1。它在某些方面是苛刻和讨厌的,但它确实产生了自我描述的流,是公开记录的,并且它被广泛使用(尽管大多数在相当有限的域中)。有相当数量的库实现编码和解码。我怀疑是否有人真的喜欢它,但如果你需要它做什么,它可能是第一选择,只是因为它已经知道并且有点被接受。
答案 2 :(得分:0)
我对这种情况的首选是ASN.1,因为它可以让您灵活地在任何一端使用您想要的任何编程语言,以及独立于平台。它隐藏了您的字节序问题,因此您不必担心它们。一端可以使用Java,而另一端使用C或C ++或C#。它还支持您可以根据需要选择的多种编码规则。如果目标是使编码尽可能小,则存在PER(压缩编码规则),或者如果您更喜欢使用XML交换信息,则存在E-XER(扩展XML编码规则),或者存在DER(Distingushed编码规则)如果您的申请涉及数字签名或证书。 ASN.1广泛用于电话,但也用于银行,汽车,航空,医疗设备和其他几个领域。它是经过成熟验证的技术,经得起时间的考验,并继续被添加到需要在不同机器和编程语言之间进行通信的新领域。
您可以尝试免费使用ASN.1的优秀资源是http://asn1-playground.oss.com,您可以在其中使用一些现有的ASN.1规范,或尝试创建自己的ASN.1规范,并查看各种编码规则产生的内容。
有一些优秀的书籍可从http://www.oss.com/asn1/resources/books-whitepapers-pubs/asn1-books.html免费下载,其中第一本书的标题是“ASN.1 - 异构系统之间的通信”。