0

我正在为 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' 而没有任何变化。某处我搞砸了,但我不确定我是否没有读取位集或没有正确写入字节。请帮忙。

4

1 回答 1

1

错误在

data = data & (0xFF & (0<<q));

如果你注意,0 << q永远是零;接下来是一些按位与,所以一切都归零。

试试这个:

data = data & ~(1<<q));

或者只是删除else部分,因为data每次在外循环周围都归零。

于 2013-09-03T00:35:34.800 回答