我是 Java 新手,并通过 UDP/TCP 编写具有自己的网络协议的程序。C中有这样一个数据包:
struct test_package {
u32 cmd;
u32 args;
u32 flags;
};
以UDP为例,我从DatagramPacket中得到的是字节数据[]。如何将其转换为包结构?
如果在 C 中,只是(struct test_package *)data
没有对齐限制。
谢谢
我是 Java 新手,并通过 UDP/TCP 编写具有自己的网络协议的程序。C中有这样一个数据包:
struct test_package {
u32 cmd;
u32 args;
u32 flags;
};
以UDP为例,我从DatagramPacket中得到的是字节数据[]。如何将其转换为包结构?
如果在 C 中,只是(struct test_package *)data
没有对齐限制。
谢谢
假设你有一堂课:
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();
}
Java 不提供直接内存访问,因此您不能像在 C 中那样将其转换为结构。您必须自己解析字节数组,例如:
byte data[] = ...;
DataInput input = new DataInputStream(new ByteArrayInputStream(data));
int cmd = input.readInt();
int args = input.readInt();
int flags = input.readInt();