Byte Order Swapping Function

Jonathan M Davis jmdavisProg at gmx.com
Thu Jul 14 03:05:07 PDT 2011


On Thursday 14 July 2011 10:55:49 Regan Heath wrote:
> On Thu, 14 Jul 2011 08:14:10 +0100, Jonathan M Davis <jmdavisProg at gmx.com>
> 
> wrote:
> > 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.
> 
> The crypto library I have been meaning to polish up and submit for
> inclusion into phobos needs these functions in several variants.  I was
> hoping they could/would be included somewhere more 'general' at some
> stage, and any duplicates like those already mentioned removed..

Oh, it could be done, and it probably should be done. But other than the 64-
bit version (since it's not particularly standard in C or C++), the functions 
are there if you need them.

- Jonathan M Davis


More information about the Digitalmars-d mailing list