2009-12-02 27 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