如何反转int的字节顺序?

use*_*690 2 c# actionscript bytearray

我很难将此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();
Run Code Online (Sandbox Code Playgroud)

Ste*_*ble 18

你可以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;
}
Run Code Online (Sandbox Code Playgroud)

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

  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 0000,和1100 0011 << 4 = 0011 0000.

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