2011-05-26 41 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