我正在创建一个字节数组的类对象,请参阅here,并将此数组传递给DatagramPacket
,以便通过UDP通信在目的地发送。在目的地端有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)
答案 0 :(得分: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);
答案 1 :(得分:0)
在发送之前和接收之后打印出字节序列。这将告诉您它们是否相同。然后检查对应于例如的字节。一个int
,您将立即看到它们是否处于正确的顺序。
由于您没有显示发送代码,因此很难更具体。