Little Endian - Big Endian问题

时间:2010-11-12 21:55:25

标签: c++ endianness

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系统 例如Follows

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

在Ideone.com上发布的示例是正确的..但它不适用于我

编辑

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

Pays Pals .. Hex或Not它没有得到正确的数字.. Visual Studio在它的调试器或我的整机中遇到严重错误..
因为我用更慢的冗余代码替换了整个代码但仍然得到相同的结果
顺便说一句,如果它有任何区别..我正在使用Debugger断开功能后检查结果

7 个答案:

答案 0 :(得分:2)

  • 您是否正确打印结果?
  • 您传入引用而不是值的事实是否会产生影响?

答案 1 :(得分:2)

您的代码似乎是正确的。

以下计划(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

答案 2 :(得分:1)

消除参数说明符中x前面的&符号。你想传递价值。

答案 3 :(得分:0)

您是否对代码进行了单元测试?

在我的平台上,这传递:

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

答案 4 :(得分:0)

编辑中的示例是输出y而不是r。输入y当然不会被修改。

答案 5 :(得分:0)

如果我运行您发布的代码,则会得到正确的结果: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        
}

检查您的代码中是否也有类似的差异。

答案 6 :(得分:0)

位操作符没有用,因为它们的操作就好像位从最低有效位到最高有效位的顺序排列,而不管真正的内部字节顺序。

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.