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

时间:2013-09-02 23:07:51

标签: c++ gps byte bitset

我正在为GNSS轨道器的校正数据构建RTCM SC104 v3.1消息。一旦我弄清楚数据必须首先发送MSB(最重要的位不是字节),我有一些固定长度的消息我没有遇到麻烦。但是对于某些可变长度消息,构建一个bitset然后复制到一定数量的字节似乎最简单。 我的问题是字节输出都是0x00,而我可以向控制台输入似乎正在构建的bitset。必须首先调整由该标准传输的数据,因为每个数据类型仅允许发送允许的最大值所需的位数。例如,64位浮点数必须乘以10的幂,以保持精度,然后转换为32位的整数。从这27位可以转移到msb第一模式中的消息串位。但是有些消息每个轨道器增加9.25字节,而有些消息可能会为每个轨道器增加79位。在结束之前不允许填充零以填充最后一个字节。 所以我在设置它时计算位数。然后处理携带所有位所需的数组中的字节数。我只是似乎没有得到字节的1。 因此,我正在为每个通道填充bitset,并提供良好的数据,例如这段代码:

    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'而没有任何变化。 在某个地方,我搞砸了但是我不确定我是不是在读取bitset还是没有正确地写入字节。请帮忙。

1 个答案:

答案 0 :(得分:1)

错误在

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

如果你注意,0 << q总是为零;接下来是一些按位AND,所以一切都结束为零。

请改为尝试:

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

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