bit twiddling (endianness)

torhu fake at address.dude
Mon Jan 8 06:54:11 PST 2007


Lutger wrote:
> Hi, I need to convert a uint to 4 ubytes in big endian order for which I 
> have written the function below. The thing is, I'm not 100% sure it is 
> correct for Big Endian systems, would somebody be so kind as to inform 
> me if this will work?
> 
> void concatUint(inout ubyte[] bytestream, uint num)
> {
>      bytestream.length = bytestream.length + 4;
>      static if (std.system.endian == Endian.LittleEndian)
>      {
>          bytestream[$-4] = num >> 24;
>          bytestream[$-3] = num >> 16;
>          bytestream[$-2] = num >> 8;
>          bytestream[$-1] = num;
>      }
>      else // big endian
>      {
>          bytestream[$-4] = num;
>          bytestream[$-3] = num >> 8;
>          bytestream[$-2] = num >> 16;
>          bytestream[$-1] = num >> 24;
>      }
> }


Since you haven't done any weird casting, the compiler (or is it cpu?) 
knows that num is an uint.  So the bit shifting will behave like num is 
big endian, no matter the endianness of the system.

In other words, your code for little endian systems is correct for big 
endian too.  But your big endian code swaps the byte order, resulting in 
little endian order in bytestream.


More information about the Digitalmars-d-learn mailing list