这是交换字节序的合法方法吗?

时间:2018-07-27 12:45:46

标签: c# .net

正如标题所述,我有UInt16,它是使用BinaryReader从文件中读取的。该文件包含顺序为“ 0x0102”的十六进制,而在读取后则相反。这是合法的吗?我听说BitConverter根据PC中字节序设置的方式工作,但是我使用了两次,所以看起来一切正常吗?

public static UInt16 EndiannessSwap(UInt16 data)
{
   var step1 = BitConverter.GetBytes(data);
   var step2 = step1.Reverse().ToArray();
   var step3 = BitConverter.ToUInt16(step2, 0);
   return step3;
}

2 个答案:

答案 0 :(得分:5)

是的,尽管效率不是很高,但是此代码可以工作并且可以移植。 没错,BitConverter根据机器的字节顺序工作,但是由于您使用它的输出作为输入,因此可以抵消。

更有效的交换字节序的方法是使用移位。看到UInt16仅由2x byte(8位)组成,我们可以很容易地按如下所示交换它:

public static UInt16 EndiannessSwap(UInt16 data)
{
   return unchecked((ushort)((data << 8) | (data >> 8)));
}

答案 1 :(得分:1)

我使用的是非常相似的解决方案,没有问题:

public static UInt16 EndiannessSwap(UInt16 data)
{
    var intAsBytes = BitConverter.GetBytes(data);
    Array.Reverse(intAsBytes);
    return BitConverter.ToUInt16(intAsBytes, 0);
}