【问题标题】:Convert 3 Successive bytes to two int将 3 个连续字节转换为两个 int
【发布时间】:2016-05-06 09:42:49
【问题描述】:

我熟悉将两个连续字节转换为 int 1:

我想要的格式是Little Endian

int number= ((int)BYTE2<<8) | ((int)BYTE1);

现在我设置相机以 12packed 格式向我发送数据。这意味着要获得一个字节,我需要完整的第一个字节,而第二个字节只需要 4 位。

因此每 3 个字节我可以有两个 12 位 int 数字:

我需要获取第一个字节的整体,前 4 位形成第二个字节,并将这 12 位组合成一个小端格式的 int。

然后我需要从第二个字节和整个第三个字节中取出最后 4 位,并以小端顺序组合它们以获得第二个 int。见附图。

如何使用位移操作来实现这一点?

对不起,我不熟悉位移操作

我怀疑这是正确的方法,但这至少是正确的方法吗?

int FirstInt= ((int)(BYTE2 & 0xF0)<<8) | ((int)BYTE1);
int SecondInt= ((int)BYTE3<<8) | ((int)(BYTE2 & 0x0F));

【问题讨论】:

  • 是的,如果 byte2 的底部是第二个 int 的最低有效位,那么在我看来是正确的 - 除非你想将 byte3 左移 4 而不是 8。
  • 感谢您的分析员 Uwe Keim。所以你认为我应该这样: int SecondInt= ((int)BYTE3

标签: c# bit-shift endianness


【解决方案1】:

如果您拥有所有数据字节,则可以使用 BitArray。

byte[] completeData = //your data

我有两个函数用于将其转换为大端,您可以将其转换为小端。

     public static BitArray ToBigEndian(byte[] byteArray)
     {
        if (byteArray == null)
        {
           return null;
        }
        BitArray bitArray;

        if (BitConverter.IsLittleEndian)
        {
           bitArray = new BitArray(byteArray.Length * 8);
           int offset = 0;
           foreach (var byteValue in byteArray)
           {
              for (int index = 0; index < 8; index++)
              {
                 bool isBitSet = (byteValue & (0x80 >> index)) > 0;
                 bitArray.Set(offset + index, isBitSet);
              }
              offset += 8;
           }
        }
        else
        {
           bitArray = new BitArray(byteArray);
        }
        return bitArray;
     }

     public static byte[] FromBigEndian(BitArray bitArray)
     {
        if (bitArray == null || bitArray.Length <= 0 || bitArray.Length % 8 > 0)
        {
           return null;
        }

        int countOfBytes = bitArray.Length / 8;

        byte[] byteArray = new byte[countOfBytes];


        if (BitConverter.IsLittleEndian)
        {
           for (int index = 0; index < bitArray.Length; index += 8)
           {
              byte value = 0;
              int dataIndex = index / 8;
              for (int i = 0; i < 8; i++)
              {
                 bool isBitSet = bitArray[index + i];
                 value |= (byte)(((isBitSet ? 0x01 : 0) << (7 - i)));
              }
              byteArray[dataIndex] = value;
           }
        }
        else
        {
           bitArray.CopyTo(byteArray, 0);
        }
        return byteArray;
     }

这样你可以循环你的比特:

BitArray completeBitArray = ToBigEndian(completeData);

【讨论】:

    猜你喜欢
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    • 2019-05-24
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多