Little Endian - Big Endian Problem

后端 未结 7 543
你的背包
你的背包 2021-01-13 14:15

Little Endian vs Big Endian

Big Endian = 0x31014950
Little Endian = 0x50490131

However Using this Method

inline unsigned int endian         


        
相关标签:
7条回答
  • 2021-01-13 14:30

    Have you unit-tested your code?

    On my platform, this passes:

    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); 
    }
    
    0 讨论(0)
  • 2021-01-13 14:32

    Eliminate the ampersand in front of the x in your argument specifier. You want to pass the value.

    0 讨论(0)
  • 2021-01-13 14:35

    Bit operators are not useful because they operates as if the bits are arranged in order from least significant bit to most significant bit regardless of the true internal byte order.

    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
    }
    

    You change the number above and make it return 1 when it is BigEndian.

    0 讨论(0)
  • 2021-01-13 14:40

    The example in your edit is outputting y not r. The input y is, of course, not modified.

    0 讨论(0)
  • 2021-01-13 14:47
    • Are you printing the result correctly?
    • Does the fact that you're passing in a reference instead of a value make a difference?
    0 讨论(0)
  • 2021-01-13 14:49

    Your code seems to be correct.

    The following program (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;
    }
    

    outputs:

    12345678 78563412


    Edit:
    you need std::cout << std::hex << r, otherwise you are printing (1) wrong variable, and (2) in decimal :-)

    See this example: http://ideone.com/EPFz8

    0 讨论(0)
提交回复
热议问题