将byte []转换为sbyte []

时间:2014-09-10 07:42:04

标签: c# type-conversion

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

这是我的示例数组:

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

我已经尝试过了:

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

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

有没有人有更好的主意?

4 个答案:

答案 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();