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