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