2012-10-04 41 views
2

這是DATA 1我的整個解析邏輯遭受因爲空字符如何解決此

RE00002200050046\00 0.00 0.1 0.125.9\0#####- 14 0##### \0 0##### 141.0\004.00 0: 00.000.0\00 4: 011:27 0: 015:27#\0###########2.00.0\0 

另一個數據,我必須是 這是DATA 2

RE000022601\0500460 0.00 0.1\0 0.236.8####\0# 57- 2#####- 3#####\0- 601.004.0\00 4: 00.000.\000 4: 013:37 0\0: 017:37#####\0#######2.00.\00 

上述數據是我得到醫院機器的迴應,我必須解析上述數值並按給定格式填寫: -

BYTEs 2   2   4    128   2   2 
    +---------+--------+------------+-----------------+--------+-------+ 
    | RE  | 00 | machine no| Data part  | Check | CRC | 
    |   |  |   |     | sum |  | 
    +---------+--------+------------+-----------------+--------+-------+ 

正如你可以從數據1看到我的數據部分從「000500 ..」 和數據2開始我的數據部分從「601 \ 0500 ...」開始 在解析時,我遇到了一個問題,從「數據1」開始的長度爲3個字節的「血泵流量」,我們得到它的值爲「46」,而從 「數據2」我得到其值爲「460」。 實際上它的值應該是「460」 如果我得到像數據1的數據,我的整個解析邏輯受到影響,因爲「血泵流量」是「3字節」,我得到一個值「46 \ 0」和「0 「被添加到另一個領域,而」血泵流量「應該是」460「。 以上只是一個例子,我也爲其他一些領域得到了很多次。 如何解決此問題。

數據1和數據2是我從機器獲得的二進制數據。

enter image description here

+3

我不完全確定我理解你的解釋。 –

+1

請顯示代碼,這樣更容易理解。 –

+1

QJesse很好的解析代碼? – user1402643

回答

0

這似乎從你的例子,它是由你自己的評論證實,你知道這些字段大小在格式。所以你必須把這個輸入視爲二進制輸入。使用std::istream::read函數。

unsigned char header[14]; 
is.read(header,14); 
if (is.gcount() == 14) 
{ 
    // decide which DATA1 or DATA2 you read from header contents 
    if (header is for DATA1) 
     // read rest of input as DATA1 
    // decide which DATA1 or DATA2 you read from header contents 
    else if (header is for DATA2) 
     // read rest of input as DATA2 
    else 
     //report error 
} 
+0

先生,我還沒有決定要使用哪一個數據1或數據2,數據1和數據2是當我請求機器時得到的二進制數據,在一分鐘後我要求機器週期性地處理數據,所以有時候我得到數據1和一些時間作爲迴應,我得到數據2. – user1402643

+0

所以你需要檢查如果從響應讀取的頭是DATA1或DATA2 - 則分別讀取其餘的二進制數據作爲DATA1或DATA2。 – PiotrNycz