我正在开发客户端服务器应用程序。我们有从服务器发送和查询数据的协议(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++;
}
所有的方法都失败了,结果是
- 它正确地打印了前三个字节,之后没有。
- 有时调用 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/