对于我编写的那种程序(处理原始文件数据),我经常需要一些函数来在高字节和低字节之间进行转换。通常我自己写这些(这里有许多其他帖子介绍),但我并不热衷于这样做,原因有很多-主要的一个是缺乏测试。我真的不想花很长时间在大端仿真器中测试我的代码,并且经常完全省略大端机器的代码。我也更愿意利用各种编译器提供的更快的函数,同时仍然保持我的程序跨平台。
我能找到的唯一的东西是套接字调用,比如htons(),但它们在每个平台上需要不同的#include文件,以及一些GPL代码like this,然而,这个特定的文件,虽然全面,但似乎错过了一些编译器提供的一些高性能函数。
那么,有没有人知道一个经过良好测试的库(理想情况下只是一个.h文件),它提供了一组标准函数来处理跨许多编译器和平台的字节序问题?
发布于 2010-04-03 18:24:50
在过去的十年中,已经有许多关于Boost类(至少对于C++ )的提案来实现这一点,但不幸的是,没有一个提案取得成果。
我不知道还有什么比htons()函数集更好的广义解决方案。
发布于 2010-04-04 03:05:32
最简单的方法就是不编写与endian相关的代码。您永远不应该关心正在运行的系统的字节序是什么;唯一重要的是您正在读取或写入的任何外部数据的强制字节序。您不应该询问高位和低位端值之间的转换,而应该询问从特定端值到主机端值的转换,并且您可以以(几乎)完全可移植的与端序无关的方式编写代码:
例如:假设您正在从文件流中读取一个32位的big-endian整数:
/*
* Note that callers should check feof(fp) afterward to verify that
* there was enough data to read.
*/
uint32_t GetBE32(FILE* fp)
{
uint32_t result;
result = fgetc(fp) << 24;
result |= fgetc(fp) << 16;
result |= fgetc(fp) << 8;
result |= fgetc(fp);
return result;
}
uint32_t GetLE32(FILE* fp)
{
uint32_t result;
result = fgetc(fp);
result |= fgetc(fp) << 8;
result |= fgetc(fp) << 16;
result |= fgetc(fp) << 24;
return result;
}(我之所以说“(几乎)完全可移植”,是因为它确实假设每个字节有8位。但是,如果您所在的系统不是这样,那么在处理外部数据时,您可能会遇到更大的问题。)
发布于 2013-12-21 02:11:10
在linux上,有<endian.h>
http://man7.org/linux/man-pages/man3/htole32.3.html
我很有兴趣了解其他操作系统是否也支持它。
https://stackoverflow.com/questions/2570923
复制相似问题