【发布时间】:2009-05-06 14:48:21
【问题描述】:
我有一个填充 sbyte[] 类型数组的函数,我需要将此数组传递给另一个接受 byte[] 类型参数的函数。
我可以在不复制所有数据或使用unsafe 魔术的情况下快速快速地转换它吗?
【问题讨论】:
-
刚刚在 Q 中添加了一些空格,希望你不介意 :D
我有一个填充 sbyte[] 类型数组的函数,我需要将此数组传递给另一个接受 byte[] 类型参数的函数。
我可以在不复制所有数据或使用unsafe 魔术的情况下快速快速地转换它吗?
【问题讨论】:
是的,你可以。
由于byte 和sbyte 具有相同的二进制表示,因此无需复制数据。
只需对 Array 进行强制转换,然后将其强制转换为 byte[] 就足够了。
sbyte[] signed = { -2, -1, 0, 1, 2 };
byte[] unsigned = (byte[]) (Array)signed;
【讨论】:
byte[] 到 sbyte[] 伪装成 byte[]。
您将不得不复制数据(只有引用类型的数组是协变的)——但我们可以尝试有效地完成它; 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
【讨论】:
如果您使用的是 .NET 3.5+,则可以使用以下内容:
byte[] dest = Array.ConvertAll(sbyteArray, (a) => (byte)a);
也就是说,我猜想有效地复制所有数据。
请注意,此函数也在 .NET 2.0 中,但您必须改用匿名方法。
【讨论】: