convert ubyte[k..k + 1] to int

Jonathan M Davis jmdavisProg at gmx.com
Wed May 16 11:47:44 PDT 2012


On Wednesday, May 16, 2012 17:03:44 Regan Heath wrote:
> On Wed, 16 May 2012 15:24:33 +0100, ref2401 <refactor24 at gmail.com> 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


More information about the Digitalmars-d-learn mailing list