我正在考虑将Java用于大型项目,但我无法在Java中找到任何远程表示结构的东西.我需要能够将网络数据包转换为可以在应用程序中使用的结构/类.
我知道这是可以使用RandomAccessFile,但这种方式是不接受的.所以我很好奇是否有可能将一组字节"强制转换"为像我在C中所做的那样的结构.如果这不可能那么我就不能使用Java.
所以我要问的问题是,除了指定对齐和数据类型之外,是否可以将对齐的数据转换为类而无需任何额外的工作?
dac*_*cwe 16
不可以.您不能将一个字节数组转换为类对象.
话虽这么说,你可以使用a java.nio.Buffer并轻松地提取你需要的字段,如下所示:
class Packet {
private final int type;
private final float data1;
private final short data2;
public Packet(byte[] bytes) {
ByteBuffer bb = ByteBuffer.wrap(bytes);
bb.order(ByteOrder.BIG_ENDIAN); // or LITTLE_ENDIAN
type = bb.getInt();
data1 = bb.getFloat();
data2 = bb.getShort();
}
}
Run Code Online (Sandbox Code Playgroud)
您基本上是在询问是否可以使用特定于C的解决方案来解决另一种语言的问题.可以预见,答案是'不'.
但是,完全可以构造一个类,该类在其构造函数中获取一组字节并构造适当的实例.
class Foo {
int someField;
String anotherField;
public Foo(byte[] bytes) {
someField = someFieldFromBytes(bytes);
anotherField = anotherFieldFromBytes(bytes);
etc.
}
}
Run Code Online (Sandbox Code Playgroud)
您可以确保将类实例与字节数组进行一对一映射.添加toBytes()方法以将实例序列化为字节.