将 3 个连续字节转换为两个 int

Convert 3 Successive bytes to two int

我很熟悉将两个连续的字节转换成 int 1:

我要的格式是Little Endian

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

现在我将相机设置为以 12 位压缩格式向我发送数据。这意味着要获得一个字节,我需要第一个字节是完整的,而我只需要第二个字节的 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));

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

byte[] completeData = //your data

我有两个函数是用来转big endian的,你可以转成little endian。

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