0

我是 Java 新手,并通过 UDP/TCP 编写具有自己的网络协议的程序。C中有这样一个数据包:

struct test_package {
    u32 cmd;
    u32 args;
    u32 flags;
};

以UDP为例,我从DatagramPacket中得到的是字节数据[]。如何将其转换为包结构?

如果在 C 中,只是(struct test_package *)data没有对齐限制。

谢谢

4

2 回答 2

1

假设你有一堂课:

public class TestPackage implements Serializable
{
   long cmd;
   long args;
   long flags;
}

您可以通过序列化将其作为 byte[] 存储在 DatagramPacket 中。然后在另一端,您可以获取 byte[] 并将其反序列化回 TestPackage 的确切实例。

(这是序列化/反序列化的样子)

public static byte[] serialize(Object object) {
   ByteArrayOutputStream out = new ByteArrayOutputStream();
   ObjectOutputStream oos = new ObjectOutputStream(out);
   oos.writeObject(object);
   return out.toByteArray();
}

public static Object deserialize(byte[] datagramData) {
   ByteArrayInputStream in = new ByteArrayInputStream(datagramData);
   ObjectInputStream ois = new ObjectInputStream(in);
   return ois.readObject();
}
于 2012-07-25T02:55:49.660 回答
0

Java 不提供直接内存访问,因此您不能像在 C 中那样将其转换为结构。您必须自己解析字节数组,例如:

byte data[] = ...;
DataInput input = new DataInputStream(new ByteArrayInputStream(data));

int cmd = input.readInt();
int args = input.readInt();
int flags = input.readInt();
于 2012-07-25T02:55:41.943 回答