2011-07-04 45 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; 

我寫的sendBuffer

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

客戶端是用Java編寫

我正在做這樣的事情

 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); 

你想

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

正因爲如此,你是存儲各種隨機數據的sendBuffer前幾個字節,並沒有什麼它的其餘部分。