簡體   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