IT源码网

c#之如何反转 int 的字节顺序

fff_TT 2024年09月07日 程序员 24 0

我很难将此 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(); 

请您参考如下方法:

您可以使用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 0000 ,和1100 0011 << 4 = 0011 0000 .

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


评论关闭
IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!