Log4cxx宏无法使用字符串包含空字符

时间:2011-05-26 07:04:07

标签: c++ logging log4cxx

我正在研究客户端服务器应用程序。我们有协议格式来从服务器发送和查询数据。 现在我需要在日志文件中记录来自或来自服务器的数据。 我使用的是最新版本的Log4cxx。 但是这个二进制数据也包含空字符。

一条消息像这样:

ab 40 01 00 00 00 ff f0 00 00 00 00 09 01 01 07 00 00 c0 a8 04 54 ae。

首先我尝试使用char * pMsg然后我做了一些像这样的事情 使用std string str(pMsg)都不起作用。

然后我做了类似的事情

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

所有方法都无效,结果是

  1. 正确打印前三个字节,之后没有打印。
  2. 有时候调用LOG4CXX_INFO会导致应用程序崩溃。
  3. 我使用LOG4CXX_INFO宏来记录信息。

    似乎是由于第四个字段中的NULL字符。 我发现这个链接声称可以解决问题,但我尝试使用相同的代码与LOG4CXX_INFO崩溃。 https://issues.apache.org/jira/browse/LOGCXX-162

    锄头要解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

请注意,您未正确构建std::string

当您直接调用std::string(chMsg)时,会涉及strlen调用以确定您传递的C-String的长度。不幸的是,在你的情况下,C-String是C标准中的 definition ,一系列以空字符结尾的字符。

但是还有其他std::string构造函数:

  • std::string(char const*, size_t)可让您精确调整缓冲区的长度。
  • std::string(InputIt, InputIt)可以与分隔缓冲区的两个指针一起使用。

(详见cplusplus.com

如果你使用其中任何一个,那么std::string将包含空字符而不是在第一个字符处停止,因此它应该正确打印。