2011-04-25 4 views
1

을 표시되지 않습니다 Heres는 내 코드 : 내가 마지막 줄에 중단 점을 설정하면C++ 표준 : : 벡터 <uint8>이 가득하지만, 데이터가

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를 조회는 일부 데이터가 , 그러나 didnt는 표시되게된다.

가 Heres는 (디버거에서) 데이터 : 당신이 당신의 메시지 버퍼에서 일부 바이너리 제로가 발생하는 것처럼

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 ('\0')은 문자열의 끝을 나타내는 데 사용됩니다. 따라서 m_buff의 첫 번째 요소는 0입니다.

m_buff을 반복하고 모든 바이트를 16 진수 시퀀스로 인쇄하거나 0자를 필터링하거나 다른 인쇄 할 수없는 항목을 필터링해야합니다. 뿐만 아니라 당신의 정확한 의도가 무엇인지 조금씩 다릅니다.) 당신이 진정으로 표준 출력에 바이너리 데이터를 기록 할 경우, (올바른) 알렉산더의 답변을 확장

+0

OP가 이진 데이터를 'cout'에 직접 쓰는 방법에 대한 답변을 추가했습니다. 그것은 당신의 제안을 오히려 멋지게 보완 할 것입니다. :-) –

+0

독일에서 우리는 "ich hatte ein brett vorm kopf"라고 말합니다. 고마워요, D – Daniel

+0

네, 멋지게 잘 어울립니다. –

3

, 여기 당신이 그것을 어떻게 : 당신이 c_str()를 사용하는 경우

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

그것은 다음에 문자열의 텍스트 콘텐츠를 반환 NUL 종결 자. 문자열의 "텍스트"내용도 NUM 종결자인 0x00으로 시작합니다. 따라서 C 스타일 ASCIIZ 텍스트로 보았을 때 문자열이 비어 있습니다 (즉 operator<<(std::ostream&, const char*)은 해당 인수를 해석해야합니다). 을 사용하면 올바르게 size() -aware std::string에 액세스 할 수 없으므로 c_str() 변환이 사용되지 않습니다. 앞면에 "Z"가 나타나면 아무 것도 표시되지 않습니다.

화면에 보이는 화면 형태로 NUL을 표시하려면 "\ 000", "무엇이든간에"등의 표기법을 선택해야합니다. 문자열을 한 번에 한 문자 씩 이동하여 인쇄 할 항목을 결정하십시오.

이진 형식으로 데이터를 쓰려면 c.str()을 사용하지 마십시오.을 사용하여 이진 출력으로 광고를 제공 할 수도 있습니다 &message[0], message.data() 또는 심지어 message.c_str()으로 복장하십시오. 추가 NUL 종료가 필요하지 않으며 구현이 잘못되면 size()과 함께 시간과 메모리를 낭비 할 수 있습니다.