将byte []转换为sbyte []

REM*_*rry 11 c# type-conversion

我试图将数组转换byte[]sbyte[].

这是我的示例数组:

byte[] unsigned = { 0x00, 0xFF, 0x1F, 0x8F, 0x80 };
Run Code Online (Sandbox Code Playgroud)

我已经尝试过了:

sbyte[] signed = (sbyte[])((Array)unsigned);
Run Code Online (Sandbox Code Playgroud)

但它不起作用.此操作后数组中没有值.

有人有更好的主意吗?

Sim*_*hid 20

sbyte[] signed = (sbyte[]) (Array) unsigned;
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为byte和sbyte在内存中具有相同的长度,并且可以在不需要更改内存表示的情况下进行转换.

但是,此方法可能会导致调试器出现一些奇怪的错误.如果你的字节数组不是很大,你可以Array.ConvertAll改用.

sbyte[] signed = Array.ConvertAll(unsigned, b => unchecked((sbyte)b));
Run Code Online (Sandbox Code Playgroud)


Jod*_*ell 5

使用怎么样Buffer.BlockCopy?这个答案的好处是避免了逐字节的强制转换检查。这个答案的坏处是避免了逐字节的强制转换检查。

var unsigned = new byte[] { 0x00, 0xFF, 0x1F, 0x8F, 0x80 };
var signed = new sbyte[unsigned.Length];
Buffer.BlockCopy(unsigned, 0, signed, 0, unsigned.Length);
Run Code Online (Sandbox Code Playgroud)

这只是复制字节,上面的值byte.MaxValue将具有负值sbyte

需要两行代码,但应该很快。