继承我的代码:
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> >
答案 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()
。