繁体   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