【问题标题】:How to form 32 bit integer by using four custom bytes?如何使用四个自定义字节形成 32 位整数?
【发布时间】:2022-01-25 15:31:13
【问题描述】:

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

最低字节为AA

中间字节为BB

其他中间字节为CC

最高字节为DD

我想在 where 中使用变量名:

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

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

【问题讨论】:

  • 很确定它只是BitConverter.ToInt32。看看是否有一个好的副本(在 c# 中)
  • int result = unchecked((myByte_4 << 24) | (myByte_3 << 16) | (myByte_2 << 8) | myByte_1);
  • 好的,我现在明白它对我有用。谢谢你们。我应该删除问题吗?

标签: c# integer byte bitwise-operators


【解决方案1】:

您可以在位操作的帮助下显式地构造这样的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 });

【讨论】:

    【解决方案2】:

    我们可以通过让 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
    

    我们如何获得:0xDDAABBCC?

    Er.. 如果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 ?)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-30
      • 1970-01-01
      • 2015-03-21
      • 1970-01-01
      • 1970-01-01
      • 2020-10-17
      相关资源
      最近更新 更多