gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 07:27:01 25 4
gpt4 key购买 nike

我正在为 GNSS 轨道器的校正数据构建 RTCM SC104 v3.1 消息。一旦我发现数据必须先发送 MSB(最高有效位而不是字节),我就可以毫不费力地构建几个固定长度的消息。然而,对于一些可变长度的消息,构建一个位集然后复制到一组字节数似乎是最简单的。我的问题是字节输出最终全部为 0x00,而我可以向控制台输出似乎正在正确构建的位集。此标准传输的数据必须首先进行调节,因为每种数据类型只允许发送允许的最大值所需的位数。例如,一个 64 位 float 必须乘以 10 的幂以保持精度,然后转换为 32 位整数。从这 27 位可以传输到 msb 优先模式中的消息位串。然而,一些消息为每个轨道飞行器添加 9.25 字节,而一些可能为每个轨道飞行器添加 79 位到位串。在填充最后一个字节之前不允许填充零。所以我正在计算我设置的位数。然后处理数组中携带所有位所需的字节数。我只是似乎没有得到 1 的字节。所以我用像这段代码这样的好数据填充每个 channel 的位集:

    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反正每次围绕外循环都会被归零。

关于c++ - 从位集中读取位值并传输到字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18581873/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com