我知道有很多不同的非标准方法来查找(和转换)硬件的字节顺序。例如,here就是一个!
我们有htonl()
,htons()
,ntohl()
和ntohs()
等标准函数来转换主机和网络字节顺序之间的值。
现在我的问题是,与上面提到的标准宏类似,是否有任何标准 C宏/函数可用于查找硬件的字节顺序?
答案 0 :(得分:7)
#include <stdio.h>
int little_endian(){
int x = 1;
return *(char*)&x;
}
int big_endian(){
return !little_endian();
}
int main(){
if(big_endian())
printf("big_endian\n");
if(little_endian())
printf("little_endian\n");
return 0;
}
答案 1 :(得分:2)
htonl(100) == 100
怎么样?
答案 2 :(得分:2)
Endianness是平台的一项功能,通常在编译时就已知。 htonl()
,htons()
,ntohl()
和ntohs()
并不总是函数:它们可能是使用条件编译的宏表演他们的“魔力”。为了使它们有效,有时BIG_ENDIAN
或LITTLE_ENDIAN
是#define
d(但不是两者),( edit2 )或其他实施方式BIG_ENDIAN和LITTLE_ENDIAN设置为不同的值,并且BYTE_ORDER定义为等于一个或另一个。您可以检查这些定义的值,以便在编译时找到平台的endian-ness;但是,你这样做的方式取决于你的实现。
Edit1 如果您的平台将字节顺序功能实现为函数而不是宏,则可以使用这些函数中的任何一个来查看它是否将1
转换为自身。如果确实如此,那么你的硬件是大端的。
P.S。特别感谢CharlesBailey对我的回答进行初步编辑的观察。
答案 3 :(得分:2)
也许:
#include <endian.h>
#if __BYTE_ORDER == __LITTLE_ENDIAN
#elif __BYTE_ORDER == __BIG_ENDIAN
#elif __BYTE_ORDER == __PDP_ENDIAN
#else
#error "no byte order"
#endif
答案 4 :(得分:2)
您可以存储已知值,然后检查生成的字节以了解表示,并保持在标准C的范围内。
如果你认为little-endian和big-endian是唯一的选择,那么htonl(n)== n等测试只能起作用 - 对于反例,请参阅:http://en.wikipedia.org/wiki/Endianness#Middle-endian
据我所知,endian.h没有被写入任何标准(这是一种耻辱)。它甚至不存在于所有Unix平台上。