最常用的处理字节序和文件的方法C ++

时间:2016-12-05 07:02:21

标签: c++ endianness

我开始只使用字符读取/写入8位整数到文件。不久之后我意识到我需要能够处理超过256个可能的值。我做了一些关于如何读取/写入16位整数到文件的研究,并开始意识到大端和小端的概念。我做了更多的研究,发现了一些处理字节序的不同方法,我还学会了一些编写与字节顺序无关的代码的方法。我的总体结论是,我必须首先检查我使用的系统是使用大端还是小端,根据系统使用的类型更改字节序,然后使用值。

我无法找到的一件事是在最佳/最常见方式。那我该怎么做呢?为了帮助澄清,我要求在大端和小端系统之间读取/写入16/32位整数的最佳方法。因为我担心不同系统之间的字节序,所以我也想要一个跨平台的解决方案。

2 个答案:

答案 0 :(得分:1)

在实践中,一个好习惯是避免使用二进制数据(在计算机之间交换数据),而选择text files和文本协议来交换数据。您可以使用JSON,YAML,XML等文本格式(或者有时发明自己的格式)。有许多与它们相关的C ++库,例如: jsoncpp

文本数据确实更冗长(占用更多磁盘空间)并且解析稍慢(但磁盘I / O通常是瓶颈,而不是CPU时间"浪费"在解析或编码格式如JSON)但更容易上手。

另请阅读serialization。您会发现许多图书馆正在这样做(使用一些"常见"定义良好的数据格式,例如XDRASN1)。许多文件格式包含一些描述具体编码的标头。 elf(5)格式就是一个很好的例子。

请注意,大部分时间数据(经济上)比使用它的软件更有价值。因此,非常重要的是要很好地记录数据在文件中的组织方式。

还要考虑使用databases。有时简单地将sqlite与包含JSON的表一起使用是非常有效的。

PS。如果没有真实的现实案例,您的问题就会过于宽泛,并且没有有意义的普遍答案。没有一种最好的方法!

答案 1 :(得分:1)

Basile,我同意没有普遍的答案。

在我的世界中,使用文本表示的嵌入式实时系统是亵渎神灵。文本表示和JSON比二进制表示慢至少2个数量级。对网络来说可能没什么问题。但是,当你必须每秒处理数千字节的数据(例如处理语音)时,这会产生影响。

如需深入讨论此问题,请查看ZeroMQ图书的chapter 7