如何在C#中将sbyte []转换为byte []?

时间:2009-05-06 14:48:22

标签: c# arrays

我有一个填充sbyte []类型数组的函数,我需要将这个数组传递给另一个接受byte []类型参数的函数。

我可以很好地快速转换它,而无需复制所有数据或使用unsafe魔法吗?

3 个答案:

答案 0 :(得分:47)

是的,你可以。 由于bytesbyte都具有相同的二进制表示,因此无需复制数据。 只需对阵列进行强制转换,然后将其强制转换为byte[],它就足够了。

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

答案 1 :(得分:25)

你必须复制数据(只有参考类型的数组是协变的) - 但我们可以尝试有效地做到这一点; Buffer.BlockCopy似乎有效:

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

如果它是引用类型,则只需转换引用而不复制数组:

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

答案 2 :(得分:6)

如果您使用的是.NET 3.5+,则可以使用以下命令:

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

这就是,我猜有效地复制了所有数据。

请注意,此功能也适用于.NET 2.0,但您必须使用匿名方法。