如何在没有 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));
}
我需要读取包含数百万个 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));
}