2011-05-26 73 views
1

我正在客戶端服務器application.we有協議格式發送和查詢數據從服務器。 現在我需要在日誌文件中記錄來自或去往服務器的數據。 我正在使用最新版本的Log4cxx。 但是這個二進制數據也包含空字符。Log4cxx宏不能使用字符串包含空字符

一個消息lokks這樣的:

AB 40 01 00 00 00 FF F0 00 00 00 00 09 01 01 07 00 00 C0 04 A8 54 AE。

首先我試着用char * pMsg然後我做了這樣的事情 使用std string str(pMsg)都不起作用。

然後我做了這樣的事情

char chMsg[MAX_PATH]; 
    while(i<nBuffLen) 
    { 
    chMsg[i] = *(pMsgBuff+i); 
    i++; 
    } 

所有方法無法工作,其結果是

  1. 它之後正確,沒有印刷前三個字節。
  2. 一段時間調用LOG4CXX_INFO會使應用程序崩潰。

我正在使用LOG4CXX_INFO宏來記錄信息。

它似乎是由於第四個字段中的空字符。 我發現這個鏈接聲稱要解決的問題,但我試着用LOG4CXX_INFO它崩潰的代碼。 https://issues.apache.org/jira/browse/LOGCXX-162

鋤頭解決這個問題?

+1

數據存儲在哪種類型? '的std :: string'? 'const char *'?你遺漏了最重要的細節。 – ildjarn 2011-05-26 07:19:06

+0

我已更新該問題。 – 2011-05-26 07:29:45

回答

0

請注意,您沒有適當地構建std::string

當您直接調用std::string(chMsg)時,會涉及一個strlen調用來確定您傳遞的C字符串的長度。不幸的是,在你的情況下,一個C字符串是由定義的在C標準中的一系列字符以空字符結尾。

但是也有其他std::string構造:

  • std::string(char const*, size_t)讓你精確的緩衝區的長度。
  • std::string(InputIt, InputIt)可以用兩個指針分隔緩衝區。

(多見於cplusplus.com

如果您使用的,那麼std::string將包含空字符,而不是在他們第一次停止,因此應正確打印。

+0

問題是LOG4CXX_INFO是如何在文件上寫的。我認爲當LOG4CXX_INFO在可能是字符串的緩衝區中遇到0('\ 0')或任何停止寫入的時候。我嘗試了你的接近,它只是印刷前兩個字節,而不是之後。 – 2011-05-26 08:31:16

+0

@Chris_vr:不管它是否寫入文件都不應該是相關的,如果'string'構建完好,它應該被完全打印。你有沒有嘗試在控制檯上顯示它('std :: cerr')來檢查字符串本身? – 2011-05-26 08:41:55

+0

不,它不打印 – 2011-05-26 09:33:55