bit twiddling (endianness)

Daniel Keep daniel.keep+lists at gmail.com
Mon Jan 8 06:55:19 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.

Yup: realised what it was he *actually* wanted about ten seconds ago. 
Ya beat me to it :P

	-- Daniel


More information about the Digitalmars-d-learn mailing list