2011-07-04 47 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前几个字节,并没有什么它的其余部分。