C标准库/函数查找硬件的字节顺序

时间:2011-12-29 17:21:04

标签: c

我知道有很多不同的非标准方法来查找(和转换)硬件的字节顺序。例如,here就是一个!

我们有htonl()htons()ntohl()ntohs()等标准函数来转换主机和网络字节顺序之间的值。

现在我的问题是,与上面提到的标准宏类似,是否有任何标准 C宏/函数可用于查找硬件的字节顺序?

5 个答案:

答案 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_ENDIANLITTLE_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平台上。