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

时间:2013-01-03 12:01:13

标签: java c

我正在创建一个字节数组的类对象,请参阅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)

2 个答案:

答案 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,您将立即看到它们是否处于正确的顺序。

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