我正在为 GNSS 轨道器的校正数据构建 RTCM SC104 v3.1 消息。一旦我发现数据必须首先发送 MSB(最高有效位而不是字节),我就可以毫无困难地构建几个固定长度的消息。然而,对于一些可变长度的消息,构建一个位集然后复制到一组字节数似乎是最简单的。我的问题是字节输出最终都是 0x00 而我可以将似乎正在正确构建的位集输出到控制台。此标准传输的数据必须首先进行调节,因为每种数据类型只允许发送允许的最大值所需的位数。例如,一个 64 位浮点数必须乘以 10 的幂才能保持精度,然后转换为 32 位整数。从这 27 位可以传输到 msb 优先模式中的消息位串。然而,有些消息会为每个轨道器添加 9.25 字节,而有些消息可能会为每个轨道器添加 79 位到位串中。直到最后都不允许填充零来填充最后一个字节。所以我在设置它们时计算位数。然后处理数组中携带所有位所需的字节数。我只是似乎没有得到 1 的字节。所以我用像这段代码这样的好数据填充每个通道的位集:我只是似乎没有得到 1 的字节。所以我用像这段代码这样的好数据填充每个通道的位集:我只是似乎没有得到 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' 而没有任何变化。某处我搞砸了,但我不确定我是否没有读取位集或没有正确写入字节。请帮忙。