将字节[]转换为sbyte[]

本文关键字:sbyte 转换 字节 | 更新日期: 2023-09-27 18:21:14

我尝试将数组从byte[]转换为sbyte[]

这是我的示例阵列:

byte[] unsigned = { 0x00, 0xFF, 0x1F, 0x8F, 0x80 };

我已经试过了:

sbyte[] signed = (sbyte[])((Array)unsigned);

但它不起作用。此操作之后,数组中没有值。

有人有更好的主意吗?

将字节[]转换为sbyte[]

sbyte[] signed = (sbyte[]) (Array) unsigned;

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

然而,这种方法可能会导致调试器出现一些奇怪的错误。如果字节数组不是很大,则可以使用Array.ConvertAll

sbyte[] signed = Array.ConvertAll(unsigned, b => unchecked((sbyte)b));

使用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);

这只是复制字节,高于byte.MaxValue的值将具有负的sbyte值。

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

这样做很容易:

sbyte[] signed = unsigned.Select(b=>(sbyte)b).ToArray();

我不确定语法。检查并验证。

旧的.net框架和旧的.net核心不支持repret_cast,但支持*pointer和不安全代码。新的.net版本添加了system.memory库,可以解决这个问题并复制内存。

   byte[] unsigned = { 0x00, 0xFF, 0x1F, 0x8F, 0x80 };  
   ReadOnlySpan<byte> bytesBuffer = unsigned;
   ReadOnlySpan<sbyte> sbytesBuffer = MemoryMarshal.Cast<byte, sbyte>(bytesBuffer);
   sbyte[] signed = sbytesBuffer.ToArray();