Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何按照C和C+的字节顺序将类转换为字节数组+;?_Java_C - Fatal编程技术网

Java 如何按照C和C+的字节顺序将类转换为字节数组+;?

Java 如何按照C和C+的字节顺序将类转换为字节数组+;?,java,c,Java,C,我正在为字节数组see创建一个类对象,并将该数组传递给DatagramPacket,以便通过UDP通信在目的地发送。在目标端,有一个C应用程序正在运行,我得到了有线字符。我敢肯定这和字节顺序有关。因为在接收数据包时,我能够将C的结构转换成类,但不能将C的结构转换成类。以下是sudo代码: // recieving part DatagramPacket packet = new DatagramPacket(buffer, buffer.length); socket.receive(pack

我正在为字节数组see创建一个类对象,并将该数组传递给
DatagramPacket
,以便通过UDP通信在目的地发送。在目标端,有一个C应用程序正在运行,我得到了有线字符。我敢肯定这和字节顺序有关。因为在接收数据包时,我能够将C的结构转换成类,但不能将C的结构转换成类。以下是sudo代码:

// recieving part

DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet)
UdpPacket udp = new UdpPacket(buffer);

class UdpPacket implements Serializable
{
 int a;
 byte []message = new byte[10];

 public UdpPacket(byte[] data)
 {
    ByteBuffer bb = ByteBuffer.wrap(data);
    bb.order(ByteOrder.nativeOrder());
    a = bb.getInt();
    bb.get(message);
 }

}

// sending ..
按照上述链接将UdpPacket对象转换为字节数组,但在目标位置始终存在垃圾值

DatagramSocket clientSocket = new DatagramSocket();

byte [] respoBytes = ObjectSerializer.serializeObject(udpPacket);

ByteBuffer bb = ByteBuffer.wrap(respoBytes);


byte []test = new byte[1116];
bb.order(ByteOrder.nativeOrder()); // tried all the orders here
bb.get(test);
DatagramPacket sendPacket = new DatagramPacket(test,test.length,client, Integer.parseInt(TxtFdPort.getText().toString()));
clientSocket.send(sendPacket)

)

在发送前和接收后打印字节序列。这将告诉您它们是否相同。然后检查对应于例如
int
的字节,您将立即看到它们的顺序是否正确


很难说得更具体,因为您没有显示发送代码。

最明显的问题是忽略读取数据的长度

DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);

ByteBuffer bb = ByteBuffer.wrap(packet.getData(), 0, packet.getLength());
// you need to know the endianess, not hope it's the same.
bb.order(ByteOrder.LITTLE_ENDIAN);
int a = bb.getInt(); // asuming there is at least 4 bytes.
byte[] message = new byte[bb.remaining()];
bb.get(message);
对于发送,我只会这样做

int port = Integer.parseInt(TxtFdPort.getText().toString());
byte [] respoBytes = ObjectSerializer.serializeObject(udpPacket);
DatagramPacket sendPacket = new DatagramPacket(respoBytes, respoBytes.length, client, port);
clientSocket.send(sendPacket);

我成功地接收到了数据,问题是发送到目的地时。在这种情况下,我会认为您的发送代码是我们需要查看的。@Yuvi您的ByteBuffer没有做任何有用的事情,尽管它可以截断消息。我已经按照您的建议尝试过了。。。int值的输出是这样的
83946924
它应该是
5
。这里有“C和C++的字节顺序”之类的东西,但它的主机硬件确实有一个端点。