2011-07-04 1 views
0

에서 바이트의 데이터를 읽을 수 없습니다 ++와 코드는이내가 C를 사용하여 서버를 썼다의 InputStream

char *sendBuffer = new char[4+4+1+8+48]; 
m_magicNumberBuffer[0] = 0xA9; 
m_magicNumberBuffer[1] = 0xA9; 
m_magicNumberBuffer[3] = 0xA9; 
m_magicNumberBuffer[4] = 0xA9; 
int m_dataLength = 4+4+1+8+48; 
unsigned char m_type = 1; 
long long m_deviceId = 12123122123; 
char m_msg = new char[48]; 
m_msg = "NO ERROR"; 

/* 
* Magic number; 
*/ 
memcpy(sendBuffer, m_magicNumberBuffer + offset, 4); 
offset += 4; 

/* 
* Data length 
*/ 
memcpy(sendBuffer, &m_dataLength + offset, 4); 
offset += 4; 

/* 
* Packet type 
*/ 
memcpy(sendBuffer, &m_type + offset, 1); 
offset += 1; 

/* 
* Device ID 
*/ 

memcpy(sendBuffer, &m_deviceId + offset, 8); 
offset += 8; 

memcpy(sendBuffer, m_msg + offset, 48); 
offset += 48; 

내가

write(client->getFd(), sendBuffer, MAX_LENGTH); 

클라이언트

자바

에 기록 된 sendBuffer을 쓰고 있어요처럼 보인다 나는 이런 것을하고있다.

 InputStream in = mSocket.getInputStream(); 
     DataInputStream dis = new DataInputStream(in); 

     int magicNumber = dis.readInt(); 
     int length = dis.readInt(); 
     byte[] data = new byte[length]; 
     if(length > 0){ 
      dis.readFully(data); 
     } 

그리고 뭔가 잘못 읽었습니다. 매직 넘버에 무리한 숫자가 표시되고 항상 데이터 길이가 0입니다.

어떻게 수정합니까? 미리 감사드립니다.

+0

원시 배열 대신 std :: vector 을 사용하는 것이 더 나을 것입니다. 또한 연결하는 크기에 열거 형을 사용하면 가독성을 높이는 데 도움이됩니다. 예 :'enum {PACKET_HEADER_SIZE = 4}'. memcpy 대신에 std :: copy 나 유사한 것을 사용하십시오. – fileoffset

답변

2

정말 간단합니다. offset을 대상이 아닌 sendBuffer에 추가하고 싶습니다. 예 : 대신

memcpy(sendBuffer, &m_deviceId + offset, 8); 

당신은이기 때문에, 당신은 sendBuffer의 처음 몇 바이트로 다양한 임의의 데이터를 저장하지 않으며, 그것의 나머지 부분에 아무것도

memcpy(sendBuffer + offset, &m_deviceId, 8); 

를 원한다.