java - 无法从输入流读取字节数据

标签 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);
        }

它读取了一些错误。我得到的魔数(Magic Number)不合理,数据长度始终为 0。

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

最佳答案

非常简单,真的:您想将您的offset 添加到目标sendBuffer,而不是您的源。例如。而不是

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

你想要

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

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

关于java - 无法从输入流读取字节数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6566920/

相关文章:

java - 从文件到文件程序的写入

c++ - 由于 KERNELBASE.dll 错误,GDB 无法运行程序

c++ - i18n 剥离非字母数字字符的友好方式

networking - tcpdump 与 tcpflow (或 "why isn' t tcpdump ASCII 数据包数据人类可读?”)

networking - 如何在操作系统发送/接收数据包之前对其进行分析/拦截?

ruby - 如何将二进制文件或任何文件传输到远程服务器? - ruby

java - android:从非 Activity 类中使用openOrCreateDatabase

java - setOnClickListener(android.view.View$OnClickListener)' 在空对象引用上

java - 传递给 Java main() 的命令行参数中的引号

c++ - 如何将 x 个二维数组连接成一个 3 维数组