【问题标题】:How can I reverse the byte order of an int? [closed]如何反转 int 的字节顺序? [关闭]
【发布时间】:2023-03-18 15:56:01
【问题描述】:

我很难将此 ActionScript 代码转换为 C#。我不明白如何模仿 ByteArray() 在 C# 中所做的事情。如果有人可以帮助我重新创建此功能,我将不胜感激。

ActionScript(seed 是一个 uint。):

//Start by reversing the byte order of the seed
var ba:ByteArray = new ByteArray();
ba.endian = Endian.BIG_ENDIAN;
ba.writeInt(seed);
ba.position = 0;
ba.endian = Endian.LITTLE_ENDIAN;
seed = ba.readInt();

【问题讨论】:

标签: c# actionscript bytearray


【解决方案1】:

您可以使用BitConverter.GetBytes(UInt32) 来获取您的byte[],然后在数组上调用Array.Reverse,然后使用BitConverter.ToUInt32(byte[]) 来获取您的int。

编辑

这是一种更有效且更隐秘的方法:

public static UInt32 ReverseBytes(UInt32 value)
{
     return (value & 0x000000FFU) << 24 | (value & 0x0000FF00U) << 8 |
         (value & 0x00FF0000U) >> 8 | (value & 0xFF000000U) >> 24;
}

这是您了解这里发生的事情所需要知道的:

  1. UInt32 是 4 个字节。
  2. 在十六进制中,两个字符代表一个字节。十进制的 179 == 十六进制的 B3 == 二进制的 10110011。
  3. 按位和 (&amp;) 保留在 both 输入中设置的位:1011 0011 &amp; 1111 0000 = 1011 0000;十六进制:B3 &amp; F0 = B0
  4. 按位或 (|) 保留在 either 输入中设置的位:1111 0000 | 0000 1111 = 1111 1111;十六进制,F0 | 0F = FF
  5. 按位移位运算符(&lt;&lt;&gt;&gt;)在一个值中向左或向右移动位。所以0011 1100 &lt;&lt; 2 = 1111 00001100 0011 &lt;&lt; 4 = 0011 0000

所以value &amp; 0x000000FFU 返回一个 UInt32,除了第 4 个字节设置为 0。然后&lt;&lt; 24 将第 4 个字节向左移动 24 个位置,使其成为第一个字节。然后(value &amp; 0x0000FF00U) &lt;&lt; 8 将除第三个字节之外的所有内容清零并将其向左移动,因此它是第二个字节。等等。四个(x &amp; y) &lt;&lt; z 创建了四个 UInt32,其中每个字节都已移动到它们将在反转值中的位置。最后,| 将这些 UIntt32s 字节重新组合成一个值。

【讨论】:

  • 哇,感谢您的快速响应。
  • 您能否添加一个部分来解释神秘的方式是如何工作的?
  • @S.TarıkÇetin,我已经添加了解释。
  • 这个问题已经有一段时间了,但是 IPAddress 类具有在主机和网络字节顺序之间转换的静态方法:msdn.microsoft.com/en-us/library/…
猜你喜欢
  • 2021-11-17
  • 2020-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-30
  • 1970-01-01
  • 1970-01-01
  • 2014-10-12
相关资源
最近更新 更多