无法从inputstream读取字节数据

时间:2011-07-04 02:59:10

标签: java c++ networking

我用c ++写了一个服务器,代码看起来像这样

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。

我该如何解决这个问题?提前谢谢..

1 个答案:

答案 0 :(得分:2)

非常简单,实际上:您希望将offset添加到目标sendBuffer,而不是您的来源。例如。而不是

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

你想要

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

实际上,您将各种随机数据存储到sendBuffer的前几个字节,而其余部分则没有。