2014-09-11 82 views
0

我有這個peice代碼(函數),我接收輸入緩衝區數據包作爲第一個參數,其長度作爲第二個參數。我接收的緩衝區包含一些需要的數據,但還有一些垃圾值。我只需要打印實際的數據(忽略垃圾值)。我怎麼做?包含實際數據和一些垃圾值的接收緩衝區

這裏去(簡化版本)代碼:

void decodeResp(char* in_buf, int *Len) 
{ 
    char msg_buffer[100] = {0}; 

    memcpy(msg_buffer,(in_buf),*Len); 

    printf("\n********** Response Recieved: [%s] **********\n",msg_buffer); 
} 

假設如果in_buf包含ACTUAL_DATA+(some garbage),我需要打印只是 「ACTUAL_DATA」 忽略無用值。我該如何檢查?上面的代碼將打印一切。

在此先感謝。

+0

將'\ 0'置於msg_buffer [Len]位置。或者,如果不是指針,可以使用Len而不是* Len。確保你拷貝了正確的字節數,因爲在你的代碼中,開始處的緩衝區中有零,%s應該可以正常工作。 – 2014-09-11 10:32:25

+0

什麼是垃圾數據?如果你知道期望什麼,你可以爲它做一個過濾器。此外,垃圾數據是否總是附加到實際數據中,還是在數據之間?如果附加,@ IvanIvanov的解決方案將正常工作。 – mechalynx 2014-09-11 10:41:38

+0

並確保所有符號都是1個字節或使用其他數據類型(非char)。用strcpy複製字符串。 – 2014-09-11 10:42:03

回答

1

首先,您打算如何區分實際數據垃圾

如果實際數據大小之前調用該函數已知,發送該值在*len,該特定大小執行memcpy() [不要忘記添加尾隨\0作爲串使用。

如果您需要執行內部decodeResp()檢查,過濾in_buf,計算實際數據的長度,做memcpy()對於尺寸和打印。


編輯

看來你是通過一些socket接收該數據包。您可以使用recv()調用的返回值來提供*lendecodeResp(),以防萬一您使用某個未初始化的緩衝區來接收傳入的數據包。

0

當心:

char msg_buffer[100] = {0}; 

只設置msg_buffer的第1個要素爲0

你的功能應該是這樣的:

void decodeResp(char* in_buf, int *Len) 
{ 
    char msg_buffer[100] ; 
    memcpy(msg_buffer, in_buf, *Len); 

    in_buf[*len] = 0 ; 

    printf("\n********** Response Recieved: [%s] **********\n",msg_buffer); 
} 

假設*Len包含4個in_buf點到「ABCDXXX」,「XXX」是垃圾,「ABCD」是實際數據。

decodeResp在輸入時,msg_buffer包含隨機剩餘值,例如「ghijklmnop」。

調用memcpy後,msg_buffer包含「ABCDklmnop」。

如果您現在打印msg_buffer沒有in_buf[*len]=0,您將得到「ABCDklmnop」作爲輸出。用in_buf[*len]=0 ;你會得到「ABCD」作爲輸出。

+0

謝謝邁克爾。就一件事。你有點誤解了這個問題。如果'in_buf'指向「ABCDXXX」,那麼我收到的* Len是7而不是4(* Len包含了包括垃圾長度的總長度)。這裏的問題是,每次調用函數decodeResp()時,實際的數據長度都會有所不同。實際的數據總是字母數字,垃圾是從內存中獲取的一些垃圾。 因爲memcpy(msg_buffer,in_buf,* Len)msg_buffer將包含「ABCDXXX」並且執行in_buf [* Len] = 0將會in_buf [7] = 0。這並不會幫助我解決我的問題:) – 2014-09-11 13:02:19

+0

那麼如果長度是錯誤的,那麼無法判斷緩衝區的末尾是否是垃圾。例如:長度= 7,緩衝區內容=「ABCD&%ç」。在這種情況下,「&%ç」肯定是垃圾(不是字母數字),實際數據是「ABCD」。但是如果長度爲7並且緩衝區包含「ABCDKLM」,會發生什麼情況,因此絕對沒有辦法確定「KLM」是垃圾還是實際數據。 – 2014-09-11 13:08:21

+0

Ohkay !.謝謝你的時間邁克爾。真的很感激它。 – 2014-09-11 13:13:03