如何反转一个整数的字节顺序?

3

我很难将这段ActionScript代码转换为C#。我不明白如何在C#中模仿ByteArray()的功能。如果有人能帮助我重新创建这个功能,我会非常感激。

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();

1个回答

26

您可以使用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. 按位与(&)保留在两个输入中设置的位:1011 0011 & 1111 0000 = 1011 0000;在十六进制中:B3 & F0 = B0
  4. 按位或(|)保留在任一输入中设置的位:1111 0000 | 0000 1111 = 1111 1111;在十六进制中:F0 | 0F = FF
  5. 按位移位运算符(<<>>)将位左移或右移值。因此,0011 1100 << 2 = 1111 00001100 0011 << 4 = 0011 0000

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


哇,谢谢您的快速回复。 - user2667690
请您添加一个章节来解释“神秘方式”是如何工作的? - starikcetin
1
@S.TarıkÇetin,我已经添加了一个解释。 - Steve Ruble
自从这个问题被提出已经有一段时间了,但是IPAddress类有静态方法可以在主机字节序和网络字节序之间进行转换: https://msdn.microsoft.com/zh-cn/library/system.net.ipaddress.networktohostorder(v=vs.110).aspx - MarkusSchaber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接