2017-05-17 10 views
1

자, 코드 조각이 있습니다.C++ : 값을 버퍼에 할당하면 작동하지 않습니다.

buffer = (uint8_t*)malloc(totalSize); 
buffer[0] = ((header.sequenceNumber >> 24) & 0xFF); 
buffer[1] = ((header.sequenceNumber >> 16) & 0xFF); 
buffer[2] = ((header.sequenceNumber >> 8) & 0xFF); 
buffer[3] = (header.sequenceNumber & 0xFF); 
buffer[4] = ((header.ackNumber >> 24) & 0xFF); 
buffer[5] = ((header.ackNumber >> 16) & 0xFF); 
buffer[6] = ((header.ackNumber >> 8) & 0xFF); 
buffer[7] = (header.ackNumber & 0xFF); 
buffer[8] = ((header.connectionId >> 8) & 0xFF); 
buffer[9] = (header.connectionId & 0xFF); 
buffer[10] = (0 & 0xFF); 
unsigned i = (((unsigned)header.ack) << 2) + (((unsigned)header.syn) << 1) + (unsigned)header.fin; 
buffer[11] = (i & 0xFF); 

을하고, 버퍼의 내용은 완전히 잘못된 것입니다 :이 버퍼에 헤더의 내용을 삽입합니다. 나는이 코드 조각을 추가하여 디버깅을 시도 :

std::cerr << "DEBUG: Values are: " 
    << ((header.sequenceNumber >> 24) & 0xFF) << ", " 
    << ((header.sequenceNumber >> 16) & 0xF) << ", " 
    << ((header.sequenceNumber >> 8) & 0xFF) << ", " 
    << (header.sequenceNumber & 0xFF) << ", " 
    << ((header.ackNumber >> 24) & 0xFF) << ", " 
    << ((header.ackNumber >> 16) & 0xFF) << ", " 
    << ((header.ackNumber >> 8) & 0xFF) << ", " 
    << (header.ackNumber & 0xFF) << ", " 
    << ((header.connectionId >> 8) & 0xFF) << ", " 
    << (header.connectionId & 0xFF) << ", " 
    << (0 & 0xFF) << ", " 
    << (i & 0xFF) << endl; 

std::cerr << "DEBUG: Buffer header is: " 
    << buffer[0] << ", " << buffer[1] << ", " << buffer[2] << ", " 
    << buffer[3] << ", " << buffer[4] << ", " << buffer[5] << ", " 
    << buffer[6] << ", " << buffer[7] << ", " << buffer[8] << ", " 
    << buffer[9] << ", " << buffer[10] << ", " << buffer[11] << endl; 

std::cerr << "DEBUG: getBuffer ends. The size is " << totalSize 
    << ". The buffer is " << buffer << endl; 

을 그리고 이것은 콘솔에 표시됩니다 :

DEBUG: Values are: 0, 0, 48, 57, 0, 0, 0, 0, 0, 0, 0, 2 
DEBUG: Buffer header is: , , 0, 9, , , , , , , , 
DEBUG: getBuffer ends. The size is 12. The buffer is 

12 개 값이 정확합니다. 그러나 버퍼의 12 요소는 완전히 잘못되었습니다.

+0

malloc을 사용 하시겠습니까? 당신은 C++을 쓰고 있습니다. std :: vector를 사용하십시오. –

답변

1

버퍼 내용이 정확하다고 생각하지만 stderr에보고하는 방법이 실패합니다.

std::cerr << "DEBUG: Buffer header is: " 
      << buffer[0]; 

은 (bufferuint8_t* 타입 인 경우)를 stderr하는 uint8_t 기록하지만 단지 unsigned char있어 따라서 ASCII 인코딩을 사용한다. 올바른 정수 값을 얻으려면

std::cerr << "DEBUG: Buffer header is: " 
      << int(buffer[0]); 
+0

좋아요. 나는 버퍼를 (int) buffer [0]로 조금 바꿨다. – NormalGuy

+0

@NormalGuy 도움이 되서 기쁩니다. buffer (0)는 C++ 스타일이고, (int) buffer [0]'은 나쁜 오래된 C 스타일이고 추천하지 않습니다. (하지만 당신은'malloc()을 사용하는 C 해커 인 것 같습니다.)'). – Walter