从比特集读取比特值并传输到字节数组

reading bit values from bitset and transfering to byte array

本文关键字:传输 到字节 数组 读取      更新时间:2023-10-16

我正在为GNSS轨道飞行器的校正数据构建RTCM SC104 v3.1消息。一旦我发现数据必须首先发送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;
}

我还尝试过测试位集[position]==1,也尝试过"1",但没有更改。在某个地方我搞砸了,但我不确定我是没有读取位集还是没有正确写入字节。请帮忙。

错误在中

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

如果你注意,0 << q总是零;下面是一些位AND,所以所有的结果都是零。

试试这个:

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

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