我很熟悉将两个连续的字节转换为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。见附图。
如何使用位移操作来实现此目的?
很抱歉,我不熟悉比特转换操作
我怀疑这是正确的方法,但这至少是正确的方法吗?
int FirstInt= ((int)(BYTE2 & 0xF0)<<8) | ((int)BYTE1);
int SecondInt= ((int)BYTE3<<8) | ((int)(BYTE2 & 0x0F));
答案 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);