Wine and endianness
GOUJON Alexandre
ale.goujon at gmail.com
Mon Aug 1 03:30:33 CDT 2011
On 08/01/2011 09:09 AM, David Laight wrote:
> If you have 'unsigned char bloc[]' and want to read a 32 bit LE value
> you can do:
> value = bloc[20 + 0];
> value |= bloc[20 + 1]<< 8;
> value |= bloc[20 + 2]<< 16;
> value |= bloc[20 + 3]<< 24;
> *offs = value;
> And that is correct on all architectures.
I have a BYTE[] so I will do that.
I was worried about compatibility across architectures but as you
pointed out, my code is slow and even wrong.
As always, KISS !
> To write a LE value use:
> buf[0] = value;
> buf[1] = value>>= 8;
> buf[2] = value>>= 8;
> buf[3] = value>>= 8;
>
> (For BE reverse the indexes)
Thanks for remembering me this compact syntax.
> If the item is known to be correctly aligned (or the architecture supports
> mis-aligned reads) then you can just do (eg):
> value = *(uint32_t *)(bloc + 20);
> value = le32toh(value);
> but you'll have to chase around the OS headers to find how to spell le32toh().
If I had something like uint128_t (I doubt it will ever exist), then
yeah, I would try to avoid 32 lines of code and bit shifting but I
prefer the above solution in my case.
> If you define a C struct that matches the data area (packed if it might
I thought about it but I only use the value once.
Thanks for all your advices.
Will "star" this e-mail if I need it later.
> David
More information about the wine-devel
mailing list