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不是为序列化而设计的,而是为了与作为缓冲区(字节[])键入的本机结构进行交互。