将 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);
我很熟悉将两个连续的字节转换成 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);