如何使用四个自定义字节组成 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;

}

如果您分配给这些字节然后读取 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

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?)