将字节[]转换为sbyte[]
本文关键字:sbyte 转换 字节 | 更新日期: 2023-09-27 18:21:14
我尝试将数组从byte[]
转换为sbyte[]
。
这是我的示例阵列:
byte[] unsigned = { 0x00, 0xFF, 0x1F, 0x8F, 0x80 };
我已经试过了:
sbyte[] signed = (sbyte[])((Array)unsigned);
但它不起作用。此操作之后,数组中没有值。
有人有更好的主意吗?
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();