On Wednesday, May 16, 2012 17:03:44 Regan Heath wrote: > On Wed, 16 May 2012 15:24:33 +0100, ref2401 <[email protected]> wrote: > > i have an array of ubytes. how can i convert two adjacent ubytes from > > the array to an integer? > > > > pseudocode example: > > ubyte[5] array = createArray(); > > int value = array[2..3]; > > > > is there any 'memcpy' method or something else to do this? > > You don't need to "copy" the data, just tell the compiler to "pretend" > it's a short (in this case, for 2 bytes) then copy the value/assign to an > int. e.g. > > import std.stdio; > > void main() > { > ubyte[5] array = [ 0xFF, 0xFF, 0x01, 0x00, 0xFF ]; > int value = *cast(short*)array[2..3].ptr; > writefln("Result = %s", value); > } > > The line: > int value = *cast(short*)array[2..3].ptr; > > 1. slices 2 bytes from the array. > 2. obtains the ptr to them > 3. casts the ptr to short* > 4. copies the value pointed at by the short* ptr to an int > > You may need to worry about little/big endian issues, see: > http://en.wikipedia.org/wiki/Endianness > > The above code outputs "Result = 1" on my little-endian x86 desktop > machine but would output "Result = 256" on a big-endian machine.
As long as you're going from big endian to little endian, std.bitmanip.bigEndianToNative will do the conversion fairly easily, but if they're in little endian, then the nasty casting is the way to go. - Jonathan M Davis
