std :: cout << stringstream.str () -> c_str () ничего не печатает - PullRequest
0 голосов
/ 02 декабря 2010

в функции, которая получает 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)
  • GOOD: печатает данные
  • BAD: ничего не печатает
  • TEST, assert: печатает, что mystr.size () равно переданному размеру без знака.

Я пытался:

  • string.assign (scp.rdbuf ());
  • memcpy (char, scp.str (), 10);
  • различные методы создания / выделения временных символов, строк

Нет помощи .. требуется получить std :: cout 'able std:: строка , содержащая данные (которая была выбрана из foo , которая была unsigned char , которая была пакетными данными).

Угадайте либо оригинал foo может не заканчиваться нулем, или проблема в чем-то вроде этого - просто, но не может войти ... что искать здесь?

(этот кодеще одна попытка использовать libpcap, just для печати пакетов способом C ++, без использования известных магических оболочек C ++, таких как libpcapp).

Ответы [ 3 ]

3 голосов
/ 02 декабря 2010

Для быстрого теста добавьте проверку для scp.str().size() == strlen(scp.str().c_str()), чтобы увидеть, есть ли в строке символы '\ 0', что, как я подозреваю, происходит.

2 голосов
/ 02 декабря 2010

Я думаю, вы поступаете неправильно. Похоже, здесь вы имеете дело с двоичными данными, и в этом случае вы не можете ожидать, что они будут выводить их на экран в виде текста. Что вам действительно нужно, так это шестнадцатеричный дамп .

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);

Это выводит данные побайтово и позволяет вам исследовать отдельные шестнадцатеричные значения двоичных данных. Нулевой байт будет просто выведен как 00.

1 голос
/ 02 декабря 2010

Проверьте std::cout.good() после неудачной попытки выхода. Я предполагаю, что есть какой-то сбой на выходе (то есть попытка записать непечатаемый символ в консоль), который устанавливает failbit на cout.

Также убедитесь, что строка не начинается с NULL, что приведет к ожидаемому поведению пустого вывода:)

(Примечание: пожалуйста, используйте reinterpret_cast для unsigned char *ucopy = (unsigned char*)packet;, если вы находитесь в C ++;))

...