我有一个函数可以填充类型为 sbyte[] 的数组,我需要将这个数组传递给另一个接受 byte[] 参数的函数。是否可以 在不复制所有数据或使用 unsafe 魔术的情况下进行快速转换?
是的,你可以这样做。
因为byte
和 sbyte
具有相同的二进制表示,所以不需要复制数据。
只需将其强制转换为Array,然后将其转换为byte[]
就足够了。
sbyte[] signed = { -2, -1, 0, 1, 2 };
byte[] unsigned = (byte[]) (Array)signed;
byte[]
复制到伪装成 byte[]
的 sbyte[]
中,则会抛出异常。 - Cristian Diaconescuunsigned.GetValue(0)
也会返回它的实际值 -2
。 - Vladimir ReshetnikovBuffer.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
byte[] dest = Array.ConvertAll(sbyteArray, (a) => (byte)a);