我想用十六进制的四个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;
}
如果你分配给这些字节,然后读取int
或uint
,你会得到值:
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?(