Byte Order Swapping Function

Christian Manning cmanning999 at gmail.com
Fri Jul 15 16:22:56 PDT 2011


Christian Manning wrote:

> Jonathan M Davis wrote:
> 
>> On 2011-07-15 14:23, Christian Manning wrote:
>>> Andrei Alexandrescu wrote:
>>> > On 7/14/11 5:51 AM, Regan Heath wrote:
>>> >> That's my point. I need 8/16/32/64/128 bit versions and it really
>>> >> would be better if there were general variants. My version are less
>>> >> than optimal, but do use intrinsics where possible. Someone else can
>>> >> do a far better job than I, and it really should be done once, by
>>> >> that person. Surely we have the infrastructure for someone to add
>>> >> this to phobos? If something this simple can't or won't be done, what
>>> >> hope do we have!?
>>> > 
>>> > I think we should have these functions in std.bitmanip:
>>> > 
>>> > T toBigEndian(T)(T val) if (isArithmetic!T || isSomeChar!T);
>>> > T toLittleEndian(T)(T val) if (isArithmetic!T || isSomeChar!T);
>>> > T bigEndianToNative(T)(T val) if (isArithmetic!T || isSomeChar!T);
>>> > T littleEndianToNative(T)(T val) if (isArithmetic!T || isSomeChar!T);
>>> > 
>>> > That means all characters, all integers, and all floating point
>>> > numbers. The implementations would opportunistically use intrinsics
>>> > and other specialized means.
>>> > 
>>> > The documentation should specify the relationship to htonl and ntohl.
>>> > 
>>> > If there's a need for converting endianness of larger buffers, we
>>> > might add:
>>> > 
>>> > ubyte[] toBigEndian(ubyte[] val);
>>> > ubyte[] toLittleEndian(ubyte[] val);
>>> > ubyte[] bigEndianToNative(ubyte[] val);
>>> > ubyte[] littleEndianToNative(ubyte[] val);
>>> > 
>>> > They'd use std.algorithm.reverse internally as needed.
>>> > 
>>> > It's a sweet piece of work. Anyone have the time to prepare a pull
>>> > request?
>>> > 
>>> > 
>>> > Andrei
>>> 
>>> Am I being naïve in thinking I can just do this:
>>> alias littleEndianToNative toLittleEndian;
>>> alias bigEndianToNative toBigEndian;
>>> ?
>> 
>> What you do is have a function called swapEndian (or byteSwap or whatever
>> you want to call it) and a function which returns the original value.
>> Then you alias them based on versions. e.g.
>> 
>> version(BigEndian)
>> {
>>  alias doNothing bigEndianToNative;
>>  alias swapEndian littleEndianToNative;
>>  alias doNothing nativeToBigEndian;
>>  alias swapEndian nativeToLittleEndian;
>> }
>> else
>> {
>>  alias swapEndian bigEndianToNative;
>>  alias doNothing littleEndianToNative;
>>  alias swapEndian nativeToBigEndian;
>>  alias doNothing nativeToLittleEndian;
>> }
>> 
>> But you must base your conversions (and thus your aliases) on whether the
>> machine is big endian or little endian, otherwise they're going to be
>> wrong.
>> 
>> - Jonathan M Davis
> 
> I realise this, but I was doing this with static ifs and std.system like:
> 
> T littleEndianToNative(T)(T val) if (isArithmetic!T || isSomeChar!T) {
>     static if (endian == Endian.LittleEndian) {
>         return val;
>     }
>     else {
>         return byteSwap(val);
>     }
> }
> 
> alias littleEndianToNative toLittleEndian;
> 
> And the same for BigEndian.
> 
> Chris

By same I mean substitute occurrences of little with big


More information about the Digitalmars-d mailing list