是否可以在Java中使用类似结构的构造?

Kri*_*oks 8 java struct

我正在考虑将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)


Con*_*ion 9

您基本上是在询问是否可以使用特定于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()方法以将实例序列化为字节.