Endiannes & Splitting Values

Gary Willoughby via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu Jul 7 01:14:40 PDT 2016


On Wednesday, 6 July 2016 at 21:44:37 UTC, BitGuy wrote:
> I'm trying to implement a feistel cipher that'll give the same 
> results regardless of the endianness of the machine it runs on. 
> To make the cipher I need to split a 64bit value into two 32bit 
> values, mess with them, and then put them back together. I can 
> think of a few ways to split a 64bit value with versions or the 
> endianness functions in bitmanip but it all seems pretty messy 
> for just wanting to split a value... I'm thinking maybe I can 
> just cast and bitshift so I can forget about the endianness but 
> I'm not really sure about the casting down rules and if that'd 
> work?

What about something like:

import std.stdio;

union Value
{
     ulong full;

     static struct Bits
     {
         uint high;
         uint low;
     }

     Bits bits;
     alias bits this;

     this(ulong value)
     {
         this.full = value;
     }
}

void main(string[] args)
{
     auto value = Value(77309411348);

     writefln("%s, (%b)", value.high, value.high);
     writefln("%s, (%b)", value.low, value.low);
     writefln("%s, (%b)", value.full, value.full);
}


More information about the Digitalmars-d-learn mailing list