0

我正在为字节数组创建一个类对象,请参见此处,并通过 UDP 通信将此数组传递DatagramPacket到目的地发送。在目标端,有 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)

;

4

2 回答 2

1

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

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);
于 2013-01-03T12:09:22.057 回答
0

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

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

于 2013-01-03T12:08:15.700 回答