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