6

I need to convert a byte array to a UInt16 (ushort) array. I am able to do so from a byte array to a UInt32 array.

I already looked at this SO question. But I cannot use BitConverter or the solution given in the referenced question.

I also referred to these questions as well: THIS and THIS.

This is what I have tried so far.

for (uint objIndex = 0; objIndex < data.Length; ++objIndex)
{
   data[objIndex] = (Convert.ToUInt16(byteArray[objIndex * sizeof(UInt16) + 0].ToString()) << 8) 
                               + byteArray[objIndex * sizeof(UInt16) + 1]; 
   // Error - Cannot implicitly convert type 'int' to 'ushort'. An explicit conversion exists.

   data[objIndex] = ((ushort)(byteArray[objIndex * sizeof(UInt16) + 0]) << 8)
                               + byteArray[objIndex + 1]; 
   // Error - Cannot implicitly convert type 'int' to 'ushort'. An explicit conversion exists.
}

Please let me know what is missing here.

EDIT: I was able to fix it after casting each of the number to an ushort as shown below.

for (ushort objIndex = 0; objIndex < data.Length; ++objIndex)
{
     ushort length = sizeof(UInt16);
     data[objIndex] = (ushort)( (ushort)(byteArray[objIndex * length] << (ushort)8) +
                                                 byteArray[objIndex + 1] );
}
3
  • 2
    Did you try the casts suggested by the compiler? ie: data[objIndex] = (ushort) (((ushort)(byteArray[objIndex * sizeof(UInt16) + 0]) << 8) + byteArray[objIndex + 1]; ) Commented Dec 26, 2013 at 16:45
  • Instead of editing your question, please post the solution as an aswer. Commented Dec 26, 2013 at 16:54
  • Yes, I tried it and did not work. But I was able to make the compiler error go away. Now I have to test if it works. Commented Dec 26, 2013 at 16:54

2 Answers 2

7

Check out Buffer.BlockCopy(). You can have the contents (byte[]) be dumped into a different format (UInt16[]).

Example:

var input = byte[1024];
var output = ushort[1024 / 2]; // every ushort is 2 bytes

Buffer.BlockCopy(input, 0, output, 0, 1024);
Sign up to request clarification or add additional context in comments.

1 Comment

Thanks. But I don't have Buffer.BlockCopy() (though I added the mscorlib.dll). I get the message "Name Buffer does not exist in the current context".
1

Finally it turned out to be a very simple fix (feeling silly right now). I was able to make the compiler error go away after casting each of the numbers I use to an ushort as shown below.

for (ushort objIndex = 0; objIndex < data.Length; ++objIndex)
{
    ushort length = sizeof(UInt16);
    data[objIndex] = (ushort)( (ushort)(byteArray[objIndex * length] << (ushort)8) +
                                             byteArray[objIndex + 1] );
}

Or this.

for (ushort objIndex = 0; objIndex < data.Length; ++objIndex)
{
    data[objIndex] = (ushort)((byteArray[objIndex * sizeof(UInt16)] << 8) +
                                                 byteArray[objIndex + 1] );
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.