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

Vil*_*lx- 31 c# arrays

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

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

Gus*_*Gus 48

是的你可以.由于两个bytesbyte具有相同的二进制表示没有必要复制数据.只需对阵列进行转换,然后将其转换为即可byte[],这就足够了.

sbyte[] signed = { -2, -1, 0, 1, 2 };
byte[] unsigned = (byte[]) (Array)signed; 
Run Code Online (Sandbox Code Playgroud)

  • 这样做是改变数组的*编译时类型*.有用的技术,但它取决于最终消耗结果.例如,System.Array.Copy(Array,int,Array,int,int)查看两个数组的*runtime-type*,如果你试图复制一个"真正的"`byte [],就会抛出异常.一个`sbyte []`伪装成`byte []`. (11认同)
  • 我经常使用这种方法收到不匹配的数组类型 (4认同)
  • 我收到错误“无法将类型 'sbyte[]' 转换为 'byte[]'” (2认同)

Mar*_*ell 25

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

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

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

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

  • @BoiseBaked我提供的答案是说他们需要复制数据并显示一种有效的方法来做到这一点,即"有帮助".阵列协方差的上下文是相关的:在其他几乎相同的场景中,不需要复制.如果您的异议是使用特定条款:克服它.这是一个具有复杂概念的技术领域.使用正确的术语可以避免很多混乱.这不是"自我满足",所以请从那匹高马上爬下来. (4认同)

Cli*_*ton 6

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

byte[] dest = Array.ConvertAll(sbyteArray, (a) => (byte)a);
Run Code Online (Sandbox Code Playgroud)

也就是说,我猜有效地复制了所有数据.

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

  • @BoiseBaked 不,你不能。这不会改变数组的运行时(元素)类型。 (2认同)