C#:手动位转换?
有没有比使用C#:手动位转换?,c#,byte,bits,C#,Byte,Bits,有没有比使用位转换器更好的编写方法 public static class ByteArrayExtensions { public static int IntFromUInt24(this byte[] bytes) { if (bytes == null) { throw new ArgumentNullException(); } if (bytes.Length != 3)
位转换器更好的编写方法
public static class ByteArrayExtensions
{
public static int IntFromUInt24(this byte[] bytes)
{
if (bytes == null)
{
throw new ArgumentNullException();
}
if (bytes.Length != 3)
{
throw new ArgumentOutOfRangeException
("bytes", "Must have length of three.");
}
return BitConverter.ToInt32
(new byte[] { bytes[0], bytes[1], bytes[2], 0 }, 0);
}
}
我会使用:
return bytes[2]<<16|bytes[1]<<8|bytes[0];
返回字节[2]您可以使用位移位运算符虽然移位可能更快(我不知道),位转换器
可读性更强,因此这取决于“更好”的重点。如果是32位数字,我可能也会使用位转换器。但由于24位数字已经需要摆弄,因此我认为BitConverter的可读性不高。如果BitConverter使用本机端号,那么BitConverter是否可以同时在大端号和小端号机器上工作,而您的答案只能在小端号机器上工作?@GoHeavyorgHome:给定相同的字节数组,BitConverter
将产生不同的int
,这取决于平台是大端还是小端,而不管平台的端,这个答案将产生相同的int
。你需要哪一个将取决于你的字节数组来自何处以及它是如何构造的。即使字节数组在原生端包含一个24位int,他的代码也不会工作。它将填充int的上三个字节,而不是下三个字节。我认为BitConverter不是为序列化而设计的,而是为了与作为缓冲区(字节[])键入的本机结构进行交互。