问题描述
|
我正在使用客户端服务器应用程序。我们具有协议格式,可以从服务器发送和查询数据。
现在,我需要将来自服务器或来自服务器的数据记录到日志文件中。
我正在使用最新版本的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将包含空字符而不是停在第一个空字符,因此应正确打印。