C ++ std :: vector <uint8>已填充,但未显示数据</uint8>

时间:2011-04-25 01:15:28

标签: c++ vector boost-asio

继承我的代码:

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

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

如果我在最后一行设置断点,启动debuger并查找m_buff var,有一些数据,但它没有显示。

继承数据(来自调试器):

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 个答案:

答案 0 :(得分:3)

假设调试器显示的数据是正确的,好像你的消息缓冲区中有一些二进制零。

请记住,二进制0'\0')用于表示字符串的结尾。因此,由于m_buff的第一个元素是零,因此该字符串的长度为0。

您应该迭代m_buff并将所有字节打印为十六进制序列 - 或过滤掉任何0个字符(也许还有其他不可打印的字符) - 取决于您的确切意图是什么)。

答案 1 :(得分:3)

扩展Alexander的答案(这是正确的),如果您真的想将二进制数据写入标准输出,请按照以下方式进行:

std::cout.write(&m_buff[0], m_buff.size());

答案 2 :(得分:3)

使用c_str()时,它返回字符串的文本内容,后跟NUL终止符。你的字符串的“文本”内容也以0x00开头 - 一个NUL终结符。因此,看作C风格的ASCIIZ文本,你的字符串是空的(operator<<(std::ostream&, const char*)必须解释它的参数,因为c_str()转换阻止使用operator<<(std::ostream&, const std::string&)来访问正确size() {1}} - 知道std::string。所以 - ASCIIZ在前面有一个“Z”:什么都不会显示。

如果你想以一些可见的屏幕形式显示NUL,你必须选择一些表示,例如“\ 000”,“”无论如何,并在你的字符串中移动一个字符,一次决定要打印什么

如果您只想以二进制形式写出数据,请不要使用c.str():您还可以使用std::cout.write(address, number_of_bytes)作为二进制输出,提供&message[0]的地址, message.data()甚至message.c_str()虽然您不需要额外的NUL终止,但实施不当可能会浪费时间和内存创建一个,以及size()