2010-12-02 2 views
0

в функции, которая получает символ без знака & & без знака длиной обугленного,станд :: соиЬ << stringstream.str() -> c_str() ничего не печатает

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: печатает ничего (не думаю, есть указатель на константные .. случай)
  • ХОРОШО: печатает данные
  • BAD: ничего не печатает
  • TEST, assert: выводит, что mystr.size() равен переданному значению без знака.

Я пробовал:

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

Никакой помощи .. он хотел получить зЬй :: COUT «в состоянии станд :: строка, которая содержит данные, (который был выбрал из foo, который был unsigned char, который был пакетными данными).

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

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

+5

Как "std :: cout <<" BAD: "<< scp.str()-> c_str() << std :: endl;` even * компиляция * ?? Функция-член `std :: stringstream :: str()` не возвращает указатель. Он возвращает экземпляр `std :: string`. – 2010-12-02 19:56:34

+0

@Charles Salvia, ой. получил ошибку, пытаясь вспомнить все ошибочные попытки пережевывать его. – 2010-12-02 19:59:13

+0

Что такое foo_len? – 2010-12-02 19:59:17

ответ

3

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

1

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

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

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

2

Думаю, вы идете по этому пути неправильно. Похоже, вы имеете дело с двоичными данными здесь, и в этом случае вы не можете ожидать значительного вывода его на экран в виде текста. Что вам действительно нужно - это hex dump.

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.