std :: cout << stringstream.str() - > c_str()什么都没打印
-
30-09-2019 - |
题
在一个函数中,可以获得未签名的char && unsigned char长度,
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);
}
结果:
- 是:什么都没有打印(猜猜有一个指针到const。
- 好:打印数据
- 不好:什么都没有打印
- 测试,断言:打印Mystr.Size()等于传递的未签名炭尺寸。
我试过:
- string.Assign(scp.rdbuf());
- memcpy(char,scp.str(),10);
- 创建/分配临时炭的不同方法
没有帮助..它想要得到一个 std :: Cout'有能力的 std :: string 包含数据(从 foo, ,那是 无符号的字符, ,是数据包数据)。
猜测是原始的 foo 可能不会被终止终止,或者问题是这样的 - 简单,但不能进入。.这里要寻找什么?
(此代码是使用libpcap的另一种尝试,只是以C ++的方式打印数据包,而无需使用已知的C ++魔术包装器,例如LibpCapp)。
解决方案
要进行快速测试,请进行检查 scp.str().size() == strlen(scp.str().c_str())
查看字符串中是否有嵌入式“ 0”字符,这是我怀疑正在发生的事情。
其他提示
我认为您以错误的方式进行操作。看来您在这里处理二进制数据,在这种情况下,您不能指望将其作为文本将其输出到屏幕上。您真正需要的是 十六进制.
const unsigned char* ucopy = packet;
std::ios_base::fmtflags old_flags = std::cout.flags();
std::cout.setf(std::ios::hex, std::ios::basefield);
for (const unsigned char* p = ucopy, *e = p + pkthdr->len; p != e; ++p) {
std::cout << std::setw(2) << std::setfill('0') << static_cast<unsigned>(*p) << " ";
}
std::cout.flags(old_flags);
这将输出逐字节的数据字节,并让您检查二进制数据的单个十六进制值。 null字节将简单地输出为 00
.
查看 std::cout.good()
输出尝试失败后。我的猜测是,输出有一些故障(即试图在控制台上写下不可打印的字符),这是设置 failbit
在 cout
.
还要检查以确保字符串不会以 NULL
, ,这将导致空输出成为预期的行为:)
(旁注,请使用 reinterpret_cast
为了 unsigned char *ucopy = (unsigned char*)packet;
如果您在C ++中;)
不隶属于 StackOverflow