如何在没有 BitConverter 的情况下交换 Int16 的字节顺序

How to swap endianness of Int16 without BitConverter

我需要读取包含数百万个 Int16 存储为大端的二进制文件。

我的第一个方法是使用 BitConverter 和 Array.Reverse() 但这对我来说太慢了。有没有办法用按位算术代替?

那么 Int16 的数学公式就是:

public Int16 SwitchEndianness(Int16 i)
{
    return (Int16)((i << 8) + (i >> 8));
}

或者如果您有一个 2 字节数组:

public Int16 SwitchEndianness(byte[] a)
{
    //TODO: verify length
    return (Int16)((a[0] << 8) + a[1]);
}

但你必须尝试一下,看看它是否比反转数组更快。

Int16 值为负时,Stanley 提出的第一个解决方案失败。 有关解释,请参阅 shifting the sign bit in .Net

正确的实施应该是

private Int16 SwitchEndianness(Int16 i)
{
    return (Int16)((i << 8) + ((UInt16)i >> 8));
}