Search code examples
c++pythonendianness

dealing with endianness in c++


I am working on translating a system from python to c++. I need to be able to perform actions in c++ that are generally performed by using Python's struct.unpack (interpreting binary strings as numerical values). For integer values, I am able to get this to (sort of) work, using the data types in stdint.h:

struct.unpack("i", str) ==> *(int32_t*) str; //str is a char* containing the data

This works properly for little-endian binary strings, but fails on big-endian binary strings. Basically, I need an equivalent to using the > tag in struct.unpack:

struct.unpack(">i", str) ==> ???

Please note, if there is a better way to do this, I am all ears. However, I cannot use c++11, nor any 3rd party libraries other than Boost. I will also need to be able to interpret floats and doubles, as in struct.unpack(">f", str) and struct.unpack(">d", str), but I'll get to that when I solve this.

NOTE I should point out that the endianness of my machine is irrelevant in this case. I know that the bitstream I receive in my code will ALWAYS be big-endian, and that's why I need a solution that will always cover the big-endian case. The article pointed out by BoBTFish in the comments seems to offer a solution.


Solution

  • Unpack the string one byte at a time.

    unsigned char *str;
    unsigned int result;
    
    result =  *str++ << 24;
    result |= *str++ << 16;
    result |= *str++ << 8;
    result |= *str++;