1

我正在开发客户端服务器应用程序。我们有从服务器发送和查询数据的协议格式。现在我需要在日志文件中记录来自或发往服务器的数据。我正在使用最新版本的 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 会使应用程序崩溃。

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

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

锄头来解决这个问题?

4

1 回答 1

0

请注意,您没有std::string正确构建。

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

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

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

(在cplusplus.com上查看更多信息)

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

于 2011-05-26T07:36:59.390 回答