繁体   English   中英

从位集中读取位值并传输到字节数组

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM