bit twiddling (endianness)

Lutger lutger.blijdestijn at gmail.com
Mon Jan 8 07:23:29 PST 2007


torhu wrote:
> 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.

That explains a lot, especially why I wasn't able to figure it out! Now 
I wonder how I have got this weird assumption in my head that it would 
work different for big / little endian systems.

Thank you very much for clearing this up.


More information about the Digitalmars-d-learn mailing list