c# - 这是交换字节顺序的合法方法吗?

标签 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;
}

最佳答案

是的,这段代码可以工作并且可以移植,尽管效率不高。 你是对的,BitConverter 根据机器的字节顺序工作,但是因为你使用它的输出作为输入,所以这会取消。

一种更有效的交换字节顺序的方法是使用位移位。鉴于 UInt16 仅由 2x byte(8 位)组成,我们可以按如下方式轻松交换它:

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

关于c# - 这是交换字节顺序的合法方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51558241/

相关文章:

c# - Prism 事件聚合器。接收事件并再次发送

c# - 如何检查所有列表项是否具有相同的值并返回,如果不相同则返回 “otherValue”?

c# - 如果你改变它们的身份,HashSets 不会保持元素的唯一性

c# - JSON.NET 不区分大小写的反序列化不起作用

c# - 使用 TagLibSharp 读取 APEv2 mp3 标签?

C# 应用程序抛出 system.BadImageFormat 异常。在 x64 中编译的依赖项

c# - Windows Phone 返回键问题

c# - SonarQube for .Net 项目,代码覆盖率不排除标有 "ExcludeFromCodeCoverage"的文件

c# - 检查对象是否为 null 并在同一个 if 语句中比较对象的属性值是否安全?

c# - 如何在 C# 中将 serilog 记录器添加到 GenericHost 项目