我尝试将数组从byte[]
转换为sbyte[]
。
这是我的示例数组:
byte[] unsigned = { 0x00, 0xFF, 0x1F, 0x8F, 0x80 };
我已经尝试过了:
sbyte[] signed = (sbyte[])((Array)unsigned);
但它不起作用。此操作后数组中没有值。
有没有人有更好的主意?
答案 0 :(得分:16)
sbyte[] signed = (sbyte[]) (Array) unsigned;
这是有效的,因为byte和sbyte在内存中具有相同的长度,并且无需更改内存表示即可进行转换。
然而,这种方法可能会导致调试器出现一些奇怪的错误。如果您的字节数组不是很大,则可以使用Array.ConvertAll
代替。
sbyte[] signed = Array.ConvertAll(unsigned, b => unchecked((sbyte)b));
答案 1 :(得分:2)
如何使用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
值。
需要两行代码,但应该很快。
答案 2 :(得分:1)
轻松做到这一点:
sbyte[] signed = unsigned.Select(b=>(sbyte)b).ToArray();
我不确定语法。检查验证。
答案 3 :(得分:0)
旧的.net框架和旧的.net核心不支持reinterpret_cast,但支持*指针和不安全的代码。 新的.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();