如何C程序的决定,在运行时间(不是编纂时间), 它是在Little-Endian或Big-Endian CPU?

为什么它必须是"运行中"检查,而不是"complie时",是因为我建立的程序在MAC OS x是普遍的二元格式,使用我的MAC与英特尔的CPU。和这个程序预计将在英特尔和电脑CPU。即,通过通用的二进制的格式在MAC,我想建立一个程序中使用英特尔-中央处理器和运行它根据PPC CPU。

逻辑在我的程序,需要CPU检查是主要的网络字节的顺序变化的函数为64位整数。现在我有盲目地交换字节的订单,其工作确定上英特尔-中央处理器,但符PPC。这里是C功能:

unsigned long long
hton64b (const unsigned long long h64bits) {
   // Low-order 32 bits in front, followed by high-order 32 bits.
   return (
       (
        (unsigned long long)
        ( htonl((unsigned long) (h64bits & 0xFFFFFFFF)) )
       ) << 32
      )
      |
      (
       htonl((unsigned long) (((h64bits) >> 32) & 0xFFFFFFFF))
      );
}; // hton64b()

任何更好地这样做的方法在跨平台的方式?

感谢

有帮助吗?

解决方案

  • 会有预处理器宏 可用于测试,无论它 大小端。例如
   #ifdef LITTLE_ENDIAN
   do it little endian way
   #else 
   do it big endian way
   #endif.

这是编制时间,但是源于脂肪 二进制文件的编译为seperatly 每个结构,这不是一个 问题。

  • 我不确定如果macosx有 betoh64()function在sys/端。h- 如果它不会用它会做的 正确的事情。
  • 最后一个办法是简单地做 解各个字节 一种方法,是不明智的主机 endian-你只需要知道的 顺序字节是从 来源。

    uint64_t unpack64(uint8_t *src)
    {
       uint64_t val;
    
       val  = (uint64_t)src[0] << 56;
       val |= (uint64_t)src[1] << 48;
       val |= (uint64_t)src[2] << 40;
       val |= (uint64_t)src[3] << 32;
       val |= (uint64_t)src[4] << 24;
       val |= (uint64_t)src[5] << 16;
       val |= (uint64_t)src[6] <<  8;
       val |= (uint64_t)src[7]      ;
    
       return val;
    }
    

其他提示

不要打扰检查;无论你需要一个独立于网络的价值只使用hton *。有了好的设计,应该仅限于您的程序和不管它是需要独立于网络的整数之间的接口模块。

在大端系统中已经存在的网络秩序,hton *可能只是一个宏,所以它是免费的。在小端系统,你将需要无论如何做,所以检查,如果你需要做它只是放慢你失望。

如果这还不够,那么你就需要提供你想要完成什么更好的解释,为什么你需要知道系统在运行时的字节顺序。

你是否意识到在Mac通用二进制代码被编译多次,一次为每个架构?我想,当你谈论编译的时候,你指的是使用配置/让系统通知源....只是使用gcc常量(如LITTLE_ENDIAN)

您不需要在运行时检查的存储方式。当您编译应用程序作为通用二进制,它与适当的定义和宏编译多次,即使你正在建立一个英特尔机器上。在运行时,Mach-O的装载机将选择从通用二进制(即在PowerPC或I386 PPC上英特尔)运行最好的架构。

通用二进制并不意味着对多个架构一个二进制。它是指含有一个二进制用于一个架构一种脂肪二元

请参阅 HTTP: //developer.apple.com/legacy/mac/library/documentation/MacOSX/Conceptual/universal_binary/universal_binary_intro/universal_binary_intro.html 获得更多的细节。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top