处理endianness和文件C 的最常见方法

most common way to deal with endianness and files C++

本文关键字:常见 方法 endianness 文件 处理      更新时间:2023-10-16

我刚开始使用chars读取/编写8位整数。不久之后,我意识到我需要能够使用超过256个可能的值工作。我对如何读/编写16位整数到文件进行了一些研究,并意识到了大和小末日的概念。我进行了更多的研究,发现了一些不同的方法来应对尼迪亚,也学到了一些编写独立于Endian的代码的方法。我的总体结论是,我必须首先检查我使用的系统是否使用大或小末日,请根据系统所使用的类型更改endianness,然后使用值。

我找不到的一件事是最佳/最常见的在阅读/写入C (无网络)中的文件时处理endianness的方法。那我该怎么做呢?为了帮助澄清,我要求提供最佳方法,以读/编写16/32位整数到大型和小恩迪安系统之间的文件。因为我担心不同系统之间的端性,所以我也想要一个跨平台的解决方案。

最常见的方法只是在将其写入文件之前通过HTONS()或HTONL()传递您的内存值,也可以通过NTOHS()或NTOHL()从文件中读回它后。(htons()/ntohs()()句柄16位值,htonl()/ntohl()句柄32位值)

为大型CPU编译时,这些函数是无效的(它们只是将您传递给它们传递给它们的值逐字返回),因此这些值将以大端格式写入文件。当针对小型CPU进行编译时,这些函数endian-swap传递值并返回交换版本,因此,这些值将以大型式格式写入文件。

这样,文件中的值始终以大型格式存储,并且在转移到内存时,它们总是从适当的(CPU-native)格式转换为/从适当的(CPU-native)格式转换。这是最简单的方法(因为您不必编写或调试任何有条件的逻辑),并且最常见的(这些功能是在所有平台上实现的))

实际上,一个好习惯是避免二进制数据(在计算机之间交换数据),并喜欢文本文件和文本协议来交换数据。您可以使用JSON,YAML,XML,....(有时发明自己的)等文本格式。与它们相关的C 库有很多,例如jsoncpp。

文本数据确实是更多的详细数据(需要更多的磁盘空间),稍微慢一点(但是磁盘I/O通常是瓶颈,而不是CPU时间"浪费"以解析或编码JSON的形式)更容易进行。

也阅读有关序列化的阅读。您会发现很多这样做的库(使用一些"常见"定义的数据格式,例如XDR或ASN1)。许多文件格式都包含一些描述混凝土编码的标头。精灵(5)格式是一个很好的例子。

请注意,大多数情况下,数据(经济上)比从事它的软件更有价值。因此,非常重要的是,很好地记录您的数据如何在文件中组织。

还考虑使用数据库。有时,简单地将sqlite与包含JSON的表非常有效。

ps。没有实际的现实世界案例,您的问题太广泛,没有有意义的普遍答案。没有单一的最佳方法!

basile,我同意没有通用的答案。

在我的世界中,使用文本表示形式嵌入了实时系统。文本表示和JSON至少比二进制表示慢了2个数量级。对于网络来说可能很好。但是,当您必须在DSP和GPP中处理每秒几公斤数据(例如处理语音)时,这会有所作为。

有关此托比的深入讨论,请查看Zeromq书籍的第7章。