Log4cxx宏无法使用包含null字符的字符串

Log4cxx macro is not working with string contain null character

本文关键字:null 字符 字符串 包含 Log4cxx      更新时间:2023-10-16

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

有一条消息是这样的:

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

首先我尝试了char*pMsg,然后我做了一些类似的事情使用std字符串str(pMsg)两者都不起作用。

然后我做了一些类似的事情

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

所有方法都失败了,结果是

  1. 它正确地打印了前三个字节,之后就没有了
  2. 对LOG4CXX_INFO的某个时间调用会使应用程序崩溃

我正在使用LOG4CXX_INFO宏来记录信息。

这似乎是由于第四个字段中的NULL字符造成的。我找到了这个链接,声称已经解决了这个问题,但我用LOG4CXX_INFO尝试了相同的代码,它正在崩溃。https://issues.apache.org/jira/browse/LOGCXX-162

如何解决这个问题?

请注意,您没有适当地构建std::string

当您直接调用std::string(chMsg)时,会涉及一个strlen调用来确定您传递的C字符串的长度。不幸的是,在您的情况下,根据的定义,C字符串在C标准中是以null字符结尾的一系列字符。

然而,还有其他std::string构造函数:

  • std::string(char const*, size_t)可用于精确缓冲区的长度
  • CCD_ 6可以与界定缓冲区的两个指针一起使用

(详见cplusplus.com)

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