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