簡體   English   中英

Little Endian - Big Endian問題

[英]Little Endian - Big Endian Problem

Little Endian vs Big Endian

Big Endian = 0x31014950
Little Endian = 0x50490131

但是使用此方法

inline unsigned int endian_swap(unsigned int& x)  
{
return ( ( (x & 0x000000FF) << 24 ) | 
         ( (x & 0x0000FF00) << 8  ) |
         ( (x & 0x00FF0000) >> 8  ) |
         ( (x & 0xFF000000) >> 24 ) );
}

結果= 0x54110131
我花了很多時間嘗試很多類似的方法,甚至是一個類似的庫

unsigned long _byteswap_ulong(unsigned long value);  

但仍然沒有運氣..所有返回相同的結果

編輯
我正在使用Microsoft Visual Studio 2008開發Little-Endian系統
示例如下

int main()
{
    unsigned int y = 0x31014950;
    unsigned int r = endian_swap( y );
    std::cout << r;
}  

在Ideone.com上發布的示例是正確的..但它不適用於我

編輯

std::cout << std::hex << r;  

無論是方式伙伴..十六進制或不是它沒有得到正確的數字.. Visual Studio在它的調試器或我的整機中遇到嚴重的錯誤..
因為我用更慢的冗余代碼替換了整個代碼,但仍然得到相同的結果
順便說一句,如果它有任何區別..我正在使用調試器斷開功能后檢查結果

  • 您是否正確打印結果?
  • 您傳入引用而不是值傳遞的事實是否有所不同?

你的代碼似乎是正確的。

以下程序( http://ideone.com/a5TBF ):

#include <cstdio>

inline unsigned int endian_swap(unsigned const int& x)  
{
return ( ( (x & 0x000000FF) << 24 ) | 
         ( (x & 0x0000FF00) << 8  ) |
         ( (x & 0x00FF0000) >> 8  ) |
         ( (x & 0xFF000000) >> 24 ) );
}

int main()
{
    unsigned int x = 0x12345678;
    unsigned int y = endian_swap(x);
    printf("%x %x\n", x, y);
    return 0;
}

輸出:

12345678 78563412


編輯:
你需要std::cout << std::hex << r ,否則你打印(1)錯誤變量,(2)十進制:-)

請參閱此示例: http//ideone.com/EPFz8

消除參數說明符中x前面的&符號。 你想傳遞價值。

您是否對代碼進行了單元測試?

在我的平台上,這通過:

void LittleEndianTest::testLittleEndian()
{
    unsigned int x = 0x31014950;
    unsigned int result = 
         (
             ( (x & 0x000000FF) << 24 ) + 
             ( (x & 0x0000FF00) << 8  ) +
             ( (x & 0x00FF0000) >> 8  ) +
             ( (x & 0xFF000000) >> 24 ) 
         );

    CPPUNIT_ASSERT_EQUAL((unsigned int)0x50490131, result); 
}

編輯中的示例是輸出y而不是r。 當然,輸入y不會被修改。

如果我運行您發布的代碼,它會給出正確的結果: endian_swap ( 0x31014950 ) == 0x50490131

要得到結果: endian_swap ( 0x31014950 ) == 0x54110131 ,您的代碼必須等效於此:

#define __
inline unsigned int endian_swap(unsigned int& x)  
{                  //0x31014950  ->            0x54110131
    return  ( ( (x & 0x000000FF) << 24 ) |   //  50
        __    ( (x & 0x00F0F000) << 12 ) |   //   4
        __    ( (x & 0x00FF0000) << 4  ) |   //    1  
        __    ( (x & 0x00FF0000) << 0  ) |   //     1  
        __    ( (x & 0x00FF0000) >> 8  ) |   //      01
        __    ( (x & 0xFF000000) >> 24 ) );  //        31        
}

檢查您的代碼中是否也有類似的差異。

位運算符沒有用,因為它們的操作就好像位從最低有效位到最高有效位的順序排列,而不管真正的內部字節順序如何。

void isBigEndian()
{
    void *number;
    number = (int *) new int(0x01000010);
    // 0x01000010
    //   01 00 00 10                                      Hexadecimal
    //   0    1      0    0      0    0       1    0
    //   0000 0001   0000 0000   0000 0000    0001 0000   Bit
    //   1           0           0            16          Decimal
    char *byte;
    byte = (char *)number;
    cout << static_cast<int>(*byte);//prints 16: Little Endian
}

您更改上面的數字,並在BigEndian時返回1。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM