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

Mas*_*poe 2 c++ endianness

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

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

Jer*_*ner 8

最常见的方法是在将文件写入文件之前通过htons()或htonl()传递内存中的值,并在从文件中读回后通过ntohs()或ntohl()传递读取数据.(htons()/ ntohs()处理16位值,htonl()/ ntohl()处理32位值)

当为大端CPU编译时,这些函数是无操作的(它们只返回你传递给它们的值),因此这些值将以big-endian格式写入文件.当为little-endian CPU编译时,这些函数以字节方式交换传入的值并返回交换版本,因此值将再次以big-endian格式写入文件.

这样,文件中的值总是以big-endian格式存储,并且在传输到内存或从内存传输时,它们总是被转换为适当的(CPU本机)格式.这是最简单的方法(因为您不必编写或调试任何条件逻辑),并且最常见(这些函数在所有平台上实现并可用)