如何使用四个自定义字节形成32位整数



我想用十六进制的四个byte以编程方式创建一个32整数,例如:

最低字节为AA

中间字节为BB

另一个中间字节为CC

最高字节为DD

我想使用变量名,其中:

byte myByte_1 = 0xAA
byte myByte_2 = 0xBB
byte myByte_3 = 0xCC
byte myByte_4 = 0xDD

那么,通过使用上述字节并使用逐位运算,我们如何获得:0xDDAABBCC

您可以借助位运算显式构造这样的int

int result = myByte_4 << 24 | 
myByte_3 << 16 | 
myByte_2 << 8 | 
myByte_1;

请注意,我们有一个整数溢出result负数

Console.Write($"{result} (0x{result:X})");

结果

-573785174 (0xDDCCBBAA)

BitConverter的替代方案,IMHO过于冗长

int result = BitConverter.ToInt32(BitConverter.IsLittleEndian 
? new byte[] { myByte_1, myByte_2, myByte_3, myByte_4 }
: new byte[] { myByte_4, myByte_3, myByte_2, myByte_1 });

我们可以通过要求C#使我们成为一个为其成员共享内存空间的结构来实现这一点:

using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Explicit)]
struct Bynteger{
[FieldOffset(0)]
public byte Lowest;
[FieldOffset(1)]
public byte Middle;
[FieldOffset(2)]
public byte OtherMiddle;
[FieldOffset(3)]
public byte Highest;
[FieldOffset(0)]
public int Int;
[FieldOffset(0)]
public uint UInt;
}

如果你分配给这些字节,然后读取intuint,你会得到值:

var b = new Bynteger{
Lowest = 0xAA,
Middle = 0xBB,
OtherMiddle = 0xCC,
Highest = 0xDD
}; 
Console.WriteLine(b.Int);                //prints -573785174
Console.WriteLine(b.UInt);               //prints 3721182122
Console.WriteLine(b.UInt.ToString("X")); //prints 0xDDCCBBAA

我们如何获得:0xDDABBCC?

呃。。如果0xDD AA BB CC不是打字错误(你的意思是说0xDDCCBBAA`吗?(,你可以通过更改FieldOffset中的数字来改变布局,例如:

[FieldOffset(2)]
public byte Lowest;
[FieldOffset(1)]
public byte Middle;
[FieldOffset(0)]
public byte OtherMiddle;
[FieldOffset(3)]
public byte Highest;

如果您保留所说的分配(最低=0xAA等(,则会向您提供您请求的0xDDAABBCC

您也可以随意命名字段。。(可能是B1到B4?(

最新更新