正如标题所述,我有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;
}
答案 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);
}