如何使用四个自定义字节组成 32 位整数?
How to form 32 bit integer by using four custom bytes?
我想从四个十六进制的 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
是一个 替代方案 ,恕我直言 太罗嗦了 :
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# 为我们创建一个为其成员共享内存 space 的结构来做到这一点:
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
how can we obtain: 0xDDAABBCC ?
呃.. 如果 0xDD AA BB CC
不是拼写错误(你是说 0xDD CCBBAA` 吗?),你可以通过更改FieldOffset 中的数字,例如:
[FieldOffset(2)]
public byte Lowest;
[FieldOffset(1)]
public byte Middle;
[FieldOffset(0)]
public byte OtherMiddle;
[FieldOffset(3)]
public byte Highest;
会给你你要求的 0xDDAABBCC,如果你保持你说的分配(最低 = 0xAA 等)
您也可以随意命名字段..(也许是 B1 到 B4?)
我想从四个十六进制的 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
是一个 替代方案 ,恕我直言 太罗嗦了 :
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# 为我们创建一个为其成员共享内存 space 的结构来做到这一点:
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
how can we obtain: 0xDDAABBCC ?
呃.. 如果 0xDD AA BB CC
不是拼写错误(你是说 0xDD CCBBAA` 吗?),你可以通过更改FieldOffset 中的数字,例如:
[FieldOffset(2)]
public byte Lowest;
[FieldOffset(1)]
public byte Middle;
[FieldOffset(0)]
public byte OtherMiddle;
[FieldOffset(3)]
public byte Highest;
会给你你要求的 0xDDAABBCC,如果你保持你说的分配(最低 = 0xAA 等)
您也可以随意命名字段..(也许是 B1 到 B4?)