c++ - Log4cxx 宏不适用于包含空字符的字符串

标签 c++ logging log4cxx

我正在开发客户端服务器应用程序。我们有从服务器发送和查询数据的协议(protocol)格式。 现在我需要在日志文件中记录来自或发送到服务器的数据。 我正在使用最新版本的 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 然后我做了这样的事情 使用标准字符串 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 字符串是一系列以空字符结尾的字符。

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

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

(查看更多信息 cplusplus.com)

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

关于c++ - Log4cxx 宏不适用于包含空字符的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6134908/

相关文章:

java - 如何使用 Selenium 和 JavaFX 禁用 ChromeDriver 的日志记录

java - 使用多个记录器实例而不是使用单个静态记录器类有什么好处?

visual-c++ - Log4cxx DailyRollingFileAppender 未滚动

c++ - 使用 __stdcall 和 Boost 1.47.0 编译错误 log4cxx

c++ - 无法打开包含文件 : 'log4cxx\logger.h' : No such file or directory

c++ - 交错插入排序函数排序不正确

c++ - 防止检查时间到使用时间?

C++ : Extern C Functions inside a Namespace

c++ - 替换版本信息资源

mysql - 更新记录并在mysql中保留以前的记录数据