[英]reading bit values from bitset and transfering to byte array
我正在构建RTCM SC104 v3.1消息以获取GNSS轨道器的校正数据。 一旦我确定必须先发送MSB(最高有效位而不是字节),就可以毫无问题地建立几个固定长度的消息。 但是,对于某些可变长度消息,似乎最简单的方法是建立一个位集,然后将其复制到一定数量的字节中。 我的问题是字节输出全部以0x00结尾,而我可以将似乎正确构建的位集提示到控制台。 必须首先调节由该标准传输的数据,因为每种数据类型仅允许发送允许的最大值所需的位数。 例如,必须将64位浮点数乘以10的幂才能保持精度,然后将其强制转换为32位整数。 从这27位可以传输到msb第一模式中的消息位字符串。 但是,某些消息会为每个轨道器增加9.25字节,而某些消息可能会向位串中每个轨道器增加79位。 在填充最后一个字节的末尾之前,不允许填充零。 所以我在设置位数时在计算位数。 然后处理携带所有位所需的数组中的字节数。 我只是似乎没有得到1的字节。 因此,我在每个通道的位集上填充了良好的数据,例如这段代码:
for(int varPos = 5; varPos > -1; varPos --) //start on 0, end on 5
{
data_1002.set(bitPos, (datastream[baseNumber].channel[n].satID & (1<<varPos))); //test bit
bitPos++;
}
data_1002.set(bitPos,1);
bitPos++;
for(int varPos = 23; varPos > -1; varPos --) //start on 0, end on 5
{
data_1002.set(bitPos, (codeRange & (1<<varPos))); //test bit
bitPos++;
}
for(int varPos = 19; varPos > -1; varPos --) //start on 0, end on 5
{
data_1002.set(bitPos, (difference & (1<<varPos))); //test bit
bitPos++;
}
for(int varPos = 6; varPos > -1; varPos --) //start on 0, end on 5
{
data_1002.set(bitPos, (lockInd & (1<<varPos))); //test bit
bitPos++;
}
然后尝试像这样填充数组:
noBytes = (bitPos+7)/8; //number of data bytes to copy to array
if(noBytes <=0)
{
noBytes = 0;
}
cout << "no bytes to build " << noBytes << endl;
for(int w=0; w<noBytes; w++)
{
for(int q=0; q<8; q++)
{
if(data_1002[bitPos+q] == true)
{
data = data | (1<<q);
}
else
{
data = data & (0xFF & (0<<q));
}
}
bitPos = bitPos +8;
output += data;
cout << "data byte is ";
cout << data << endl;;
data = 0;
}
我也尝试过测试bitset [position] == 1,并且也尝试了'1'而没有任何变化。 我在某个地方搞砸了,但是我不确定我是在读取位集还是未正确写入字节。 请帮忙。
错误在
data = data & (0xFF & (0<<q));
如果注意, 0 << q
始终为零; 接下来是一些按位与,因此所有结果都为零。
尝试以下方法:
data = data & ~(1<<q));
或者只是删除else
部分,因为无论如何每次都在外循环周围将data
清零。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.