Byte Order Swapping Function

Jonathan M Davis jmdavisProg at gmx.com
Thu Jul 14 00:14:10 PDT 2011


On Thursday 14 July 2011 00:03:23 Andrew Wiley wrote:
> On Wed, Jul 13, 2011 at 11:59 PM, Jonathan M Davis 
<jmdavisProg at gmx.com>wrote:
> > On Wednesday 13 July 2011 23:37:02 Andrew Wiley wrote:
> > > Hey, does anyone else thing a function like this belongs in Phobos,
> > > and
> > 
> > if
> > 
> > > so, where do you think it should go?
> > > 
> > > T ntoh(T)(T val) if (__traits(isArithmetic, T)) {
> > > version(BigEndian) {
> > > 
> > >  return val;
> > > 
> > > }
> > > else version (LittleEndian) {
> > > 
> > >  ubyte[] arr = (cast(ubyte*)&val)[0 .. T.sizeof];
> > > 
> > > ubyte temp;
> > > for(int i = 0; i < T.sizeof/2; i++) {
> > > 
> > >  temp = arr[i];
> > > 
> > > arr[i] = arr[T.sizeof - i - 1];
> > > arr[T.sizeof - i - 1] = temp;
> > > 
> > >  }
> > > 
> > > return val;
> > > }
> > > 
> > >  else static assert(0, "Are you sure you're using a computer?");
> > >  }
> > > 
> > > I was looking for something along these lines in the docs today and
> > 
> > couldn't
> > 
> > > find it. It looks like there's a stream in std.stream to do this,
> > > but,
> > > well, I think we've all been pretending std.stream doesn't exist for
> > > a
> > > while now.
> > 
> > core.sys.posix.arpa.inet.d
> > std.c.windows.winsock.d
> 
> Both of those are platform specific, and neither of them is general enough
> to handle longs.

They're only platform-specific in that you have to import one in Posix and 
another in Windows. Other than that, they're completely platform-independent. 
They're the standard functions for it in C/C++. Now, it's true that there 
isn't one for ulong (since there is no standard one for 64-bit in C/C++), and 
there would definitely be some value in having a function which was overloaded 
on the type so that you could just use the one function for ushort, uint, and 
ulong, but ntohs and ntohl _are_ provided by druntime and Phobos. So, it's not 
like nothing is there.

I did have to create a 64-bit version for std.datetime, so it has a private 
function called endianSwap64 to do the job. So, it's not like I'm saying that 
the situation couldn't be improved, but druntime and Phobos do currently give 
you the exact same thing that C and C++ do.

- Jonathan M Davis


More information about the Digitalmars-d mailing list