我正在研究客户端服务器应用程序。我们有协议格式来从服务器发送和查询数据。 现在我需要在日志文件中记录来自或来自服务器的数据。 我使用的是最新版本的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++;
}
所有方法都无效,结果是
我使用LOG4CXX_INFO宏来记录信息。
似乎是由于第四个字段中的NULL字符。 我发现这个链接声称可以解决问题,但我尝试使用相同的代码与LOG4CXX_INFO崩溃。 https://issues.apache.org/jira/browse/LOGCXX-162
锄头要解决这个问题吗?
答案 0 :(得分:0)
请注意,您未正确构建std::string
。
当您直接调用std::string(chMsg)
时,会涉及strlen
调用以确定您传递的C-String的长度。不幸的是,在你的情况下,C-String是C标准中的 definition ,一系列以空字符结尾的字符。
但是还有其他std::string
构造函数:
std::string(char const*, size_t)
可让您精确调整缓冲区的长度。std::string(InputIt, InputIt)
可以与分隔缓冲区的两个指针一起使用。(详见cplusplus.com)
如果你使用其中任何一个,那么std::string
将包含空字符而不是在第一个字符处停止,因此它应该正确打印。