处理字节序和文件的最常见方法C
作者:互联网
我刚开始使用char读取/写入8位整数到文件中.不久之后,我意识到我需要能够使用超过256个可能的值.我做了一些关于如何将16位整数读/写到文件的研究,并且意识到了大小端的概念.我进行了更多研究,发现了几种处理字节序的方法,并且我还学习了一些编写与字节序无关的代码的方法.我的总体结论是,我必须首先检查我使用的系统使用的是大端还是小端,然后根据系统使用的类型来更改字节序,然后使用这些值.
我无法找到的一件事是在C语言中读写文件时最好/最常见的处理字节序的方法(无网络连接).那么我应该怎么做呢?为澄清起见,我要求一种在大型和小型字节序系统之间读取/写入16/32位整数的最佳方法.因为我担心不同系统之间的字节序,所以我也想要一个跨平台的解决方案.
解决方法:
最常见的方法是在将内存中的值写入文件之前先通过htons()或htonl()传递,并在从文件读回后将读取的数据通过ntohs()或ntohl()传递. (htons()/ ntohs()处理16位值,htonl()/ ntohl()处理32位值)
当为big-endian CPU编译时,这些函数是no-ops(它们只是逐字返回您传递给它们的值),因此这些值将以big-endian格式写入文件.当为低端字节序的CPU编译时,这些函数将对传入的值进行字节序交换,并返回交换的版本,因此,这些值将再次以大字节序格式写入文件.
这样,文件中的值将始终以big-endian格式存储,并且在将它们传输至内存或从内存传输时,始终会与相应的(CPU本地)格式进行转换.这是最简单的方法(因为您不必编写或调试任何条件逻辑),也是最常见的方法(这些功能在几乎所有平台上均已实现并可用)
标签:c,endianness 来源: https://codeday.me/bug/20191012/1903907.html