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

时间:2016-05-06 09:42:50

标签: c# bit-shift endianness

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

我想要的格式是Little Endian

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

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

结果每3个字节我可以有两个12位的int数:

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

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

enter image description here

如何使用位移操作来实现此目的?

很抱歉,我不熟悉比特转换操作

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

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

1 个答案:

答案 0 :(得分:1)

如果您拥有所有数据字节,则可以使用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);