在一个函数中,可以获得未签名的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() 输出尝试失败后。我的猜测是,输出有一些故障(即试图在控制台上写下不可打印的字符),这是设置 failbitcout.

还要检查以确保字符串不会以 NULL, ,这将导致空输出成为预期的行为:)

(旁注,请使用 reinterpret_cast 为了 unsigned char *ucopy = (unsigned char*)packet; 如果您在C ++中;)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top