std::cout << stringstream.str()->c_str() 不打印任何内容
在一个函数中,得到 unsigned char && unsigned char length,
void pcap_callback(u_char *args, const struct pcap_pkthdr* pkthdr, const u_char* packet)
{
std::vector<unsigned char> vec(packet, packet+pkthdr->len); // optimized from foo.
std::stringstream scp;
for (int i=0;i<pkthdr->len;i++) {
scp<<vec[i];
}
std::string mystr = std::string(scp.rdbuf()->str());
std::cout << "WAS: " << packet << std::endl;
std::cout << "GOOD: " << scp.str() << std::endl;
std::cout << "BAD: " << scp.str().c_str() << std::endl;
std::cout << "TEST: " << mystr.size() << std::endl;
assert(mystr.size() == pkthdr->len);
}
结果:
- WAS:不打印任何内容(猜测有一个指向 const..case 的指针)
- 好:打印数据
- 坏:不打印任何
- 内容 TEST,断言:打印 mystr.size() 等于传递的 unsigned char 大小。
我尝试过:
- string.assign(scp.rdbuf());
- memcpy(char, scp.str(), 10);
- 创建/分配临时字符、字符串的不同方法
没有帮助..希望获得一个包含数据的std::cout'ablestd::string,(其中是从 foo 中选取的,它是 unsigned char,它是数据包数据)。
猜测原始的 foo 可能不是空终止的,或者问题是这样的 - 简单,但无法进入..这里要寻找什么?
(此代码是使用 libpcap 的另一次尝试,只是以 C++ 方式打印数据包,而不使用已知的 C++ 魔术包装器(如 libpcapp)。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
为了进行快速测试,请检查
scp.str().size() == strlen(scp.str().c_str())
以查看是否嵌入了“\0”字符串中的字符,我怀疑正在发生这种情况。For a quick test, throw in a check for
scp.str().size() == strlen(scp.str().c_str())
to see if there are embedded '\0' characters in the string, which is what I suspect is happening.我认为你处理这个问题的方式是错误的。看起来您正在此处处理二进制数据,在这种情况下,您不能期望将其作为文本有意义地输出到屏幕。您真正需要的是一个十六进制转储。
这将逐字节输出数据,并让您检查二进制数据的各个十六进制值。空字节将简单地输出为
00
。I think you're going about this the wrong way. It looks like you're dealing with binary data here, in which case you can't expect to meaningfully output it to the screen as text. What you really need is a hex dump.
This will output the data byte-by-byte, and let you examine the individual hex values of the binary data. A null byte will simply be output as
00
.输出尝试失败后检查
std::cout.good()
。我的猜测是输出出现一些故障(即尝试将不可打印的字符写入控制台),这是在cout
上设置failbit
。还要检查以确保字符串不以
NULL
开头,否则会导致空输出成为预期行为:)(旁注,请使用
reinterpret_cast
来表示unsigned char *ucopy = (unsigned char*)packet;
如果您使用 C++ ;) )Check
std::cout.good()
after the failed output attempt. My guess is that there's some failure on output (i.e. trying to write a nonprintable character to the console), which is settingfailbit
oncout
.Also check to ensure the string does not start with a
NULL
, which would cause empty output to be the expected behavior :)(Side note, please use
reinterpret_cast
forunsigned char *ucopy = (unsigned char*)packet;
if you're in C++ ;) )