How to convert a sbyte[] to byte[] in C#?

I've got a function which fills an array of type sbyte[], and I need to pass this array to another function which accepts a parameter of type byte[].

Can I convert it nicely and quickly, without copying all the data or using unsafe magic?

Answers


Yes, you can. Since both byte and sbyte have the same binary representation there's no need to copy the data. Just do a cast to Array, then cast it to byte[] and it'll be enough.

sbyte[] signed = { -2, -1, 0, 1, 2 };
byte[] unsigned = (byte[]) (Array)signed; 

You will have to copy the data (only reference-type arrays are covariant) - but we can try to do it efficiently; Buffer.BlockCopy seems to work:

    sbyte[] signed = { -2, -1, 0, 1, 2 };
    byte[] unsigned = new byte[signed.Length];
    Buffer.BlockCopy(signed, 0, unsigned, 0, signed.Length);

If it was a reference-type, you can just cast the reference without duplicating the array:

    Foo[] arr = { new Foo(), new Foo() };
    IFoo[] iarr = (IFoo[])arr;
    Console.WriteLine(ReferenceEquals(arr, iarr)); // true

If you are using .NET 3.5+, you can use the following:

byte[] dest = Array.ConvertAll(sbyteArray, (a) => (byte)a);

Which is, I guess effectively copying all the data.

Note this function is also in .NET 2.0, but you'd have to use an anonymous method instead.


Need Your Help

How to POST a JSON to a specific url using VB.NET?

vb.net web-services json post

I'm a newbie about web services in VB.NET. I'm making a desktop application that will talk to JIRA (http://www.atlassian.com/software/jira/). They provided a REST api that I decided to use. The first

Matplotlib (pyplot) savefig outputs blank image

python image matplotlib figure

I am trying to save plots I make using matplotlib; however, the images are saving blank.