微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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字符串str(pMsg)都不起作用。 然后我做了这样的事情
   char chMsg[MAX_PATH];
   while(i<nBuffLen)
   {
    chMsg[i] = *(pMsgBuff+i);
    i++;
   }
所有方法都行不通,结果是 它正确打印了前三个字节,此后没有一个。 一段时间调用LOG4CXX_INFO会使应用程序崩溃。 我正在使用LOG4CXX_INFO宏来记录信息。 看来这是由于第四个字段中的NULL字符所致。 我发现此链接声称已解决问题,但我尝试使用LOG4CXX_INFO进行相同的代码崩溃。 https://issues.apache.org/jira/browse/LOGCXX-162 e头要解决这个问题?     

解决方法

请注意,您没有适当地构建
std::string
。 当直接调用
std::string(chMsg)
时,将涉及
strlen
调用以确定您传递的C字符串的长度。不幸的是,根据您的情况,C字符串在C标准中定义为以空字符结尾的一系列字符。 但是,还有其他的
std::string
构造函数:
std::string(char const*,size_t)
使您可以精确确定缓冲区的长度。
std::string(InputIt,InputIt)
可以与两个界定缓冲区的指针一起使用。 (有关更多信息,请访问cplusplus.com) 如果使用其中任何一个,则ѭ1将包含空字符而不是停在第一个空字符,因此应正确打印。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。