C ++ std :: vectorзаполнено, но данные не отображаются - PullRequest
1 голос
/ 25 апреля 2011

Вот мой код:

std::string message(m_buff.begin(), m_buff.end());

std::cout << "Client wrote sth!" << std::endl;
std::cout << message.c_str() << std::endl;

Если я установил точку останова в последней строке, запустил отладчик и нашел переменную m_buff, некоторые данные есть, но они не отображаются.

Вот данные (от отладчика):

m_buff  [0x00000400](0x00,0x08 '',0x22 '"',0x00,0x57 'W',0x6f 'o',0x57 'W',0x00,0x03 '',0x03 '',0x05 '',0x34 '4',0x30 '0',0x36 '6',0x38 '8',0x78 'x',0x00,0x6e 'n',0x69 'i',0x57 'W',0x00,0x45 'E',0x44 'D',0x65 'e',0x64 'd',0x3c '<',0x00,0x00,0x00,0x05 '',0x6c 'l',0x19 '',0x1c '',0x04 '',0x46 'F',0x47 'G',0x47 'G',0x47 'G',0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,...,...)  std::vector<unsigned char,std::allocator<unsigned char> >

Ответы [ 3 ]

3 голосов
/ 25 апреля 2011

Расширяя ответ Александра (который является правильным), если вы действительно хотите записать двоичные данные в стандартный вывод, вот как вы это делаете:

std::cout.write(&m_buff[0], m_buff.size());
3 голосов
/ 25 апреля 2011

Когда вы используете c_str(), он возвращает текстовое содержимое строки, за которым следует NUL-терминатор. Текстовое содержимое вашей строки также начинается с 0x00 - NUL-терминатор. Следовательно, в виде текста ASCIIZ в стиле C ваша строка пуста (поэтому operator<<(std::ostream&, const char*) должен интерпретировать ее аргумент, поскольку преобразование c_str () предотвращает использование operator<<(std::ostream&, const std::string&), которое могло бы иметь доступ к правильно size() -безопасному std::string. Итак - ASCIIZ с "Z" спереди: ничего не будет отображаться.

Если вы хотите отобразить NUL в какой-либо видимой экранной форме, вам нужно будет выбрать какое-либо представление, например "\ 000", "" как угодно, и перемещаться по строке по одному символу за раз, решая, что печатать. .

Если вы просто хотите записать данные в двоичном виде, не используйте c.str(): вы также можете использовать std::cout.write(address, number_of_bytes) для двоичного вывода, предоставляя адрес согласно &message[0], message.data() или даже message.c_str() хотя вам не нужно дополнительное NUL-завершение, а плохая реализация может тратить время и память на его создание вместе с size().

3 голосов
/ 25 апреля 2011

Предполагая, что данные, отображаемые отладчиком, верны, создается впечатление, что в вашем буфере сообщений есть двоичные нули.

Помните, что двоичный файл 0 ('\0') используется для обозначения конца строки. Таким образом, поскольку первый элемент m_buff является нулем, строка имеет эффективную длину 0.

Возможно, вам следует выполнить итерацию m_buff и распечатать все байты в виде шестнадцатеричных последовательностей - или отфильтровать любые 0 символы (и, возможно, другие непечатные материалы - немного зависит от ваших точных намерений).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...