2009-12-02 30 views
3

C程序如何做一个C程序确定,在运行时无论是在小端或大端CPU运行(不是编译时), ?检查CPU类型在运行时间上MAC

为什么它必须是“运行时”检查,而不是“complie-time”,是因为我用MAC-OSX的通用二进制格式构建程序,使用我的MAC和Intel-CPU。预计该程序可以在英特尔和Power-PC CPU上运行。即通过MAC上的通用二进制格式,我想使用Intel-CPU构建一个程序并在PPC CPU下运行它。

需要的CPU检查在我的程序逻辑是主机到网络字节顺序变更功能,用于64位整数。现在我已经盲目地交换了字节顺序,这在Intel-CPU上可以正常工作,但是在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() 

任何更好的方式以跨平台的方式做到这一点?

感谢

回答

1
  • 将有 可用于测试羯羊它的 大/小端预处理宏。例如
 
    #ifdef LITTLE_ENDIAN 
    do it little endian way 
    #else 
    do it big endian way 
    #endif. 

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

  • 林不知道如果MacOSX的有 betoh64()函数在sys/endian.h - 如果它 - 使用它会做的 正确的事情。
  • 最后一种方法是简单地做 开箱的单个字节的 的方式,这不是明智的主机 端 - 你只需要知道 顺序字节是从 源。

    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; 
    } 
    
0

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

2

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

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

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

0

你并不需要在运行时检查的存储方式。当您将应用程序编译为通用二进制文件时,它会使用适当的定义和宏进行多次编译,即使您正在构建英特尔机器,也是如此。在运行时,mach-o加载程序将从通用二进制文件(即PowerPC上的ppc或Intel上的i386)中选择最佳体系结构。

通用二进制并不意味着一个二进制多个体系结构。它意味着一个胖子二进制包含一个架构的二进制。

欲了解更多详情,请参阅http://developer.apple.com/legacy/mac/library/documentation/MacOSX/Conceptual/universal_binary/universal_binary_intro/universal_binary_intro.html