在 Java 中使用 C 结构
我必须编写一个Java程序,该程序将从网络接收消息并向用户显示其内容。问题是我收到的消息只是C结构的二进制转储。除此之外,一些消息来自小端机,一些来自大端机,而没有将字段转换为网络字节顺序。我的一种方法是使用JNI并将c结构转换为某个XML字符串,然后将此XML字符串反序列化为Java对象。这是一项艰巨的工作,因为大约有122种不同的结构,每个结构都包含20多个字段。我想知道是否有一个库/工具/方法可以让我的工作变得容易一些?
我必须编写一个Java程序,该程序将从网络接收消息并向用户显示其内容。问题是我收到的消息只是C结构的二进制转储。除此之外,一些消息来自小端机,一些来自大端机,而没有将字段转换为网络字节顺序。我的一种方法是使用JNI并将c结构转换为某个XML字符串,然后将此XML字符串反序列化为Java对象。这是一项艰巨的工作,因为大约有122种不同的结构,每个结构都包含20多个字段。我想知道是否有一个库/工具/方法可以让我的工作变得容易一些?
有一个名为Preon的库,旨在帮助您完成此类任务:Preon站点 基本上,他们试图将从二进制流中读取pojo的所有逻辑保留在与pojo中的每个字段相关联的注释中。
他们的文档中的一个例子,您可以在其中控制正在阅读的int的大小:
class Rectangle
{
@BoundNumber(size="16") private int x1;
@BoundNumber(size="16") private int y1;
@BoundNumber(size="16") private int x2;
@BoundNumber(size="16") private int y2;
}
或指定字节序:
class Rectangle
{
@BoundNumber(byteOrder=LittleEndian) private int x1;
@BoundNumber(byteOrder=LittleEndian) private int y1;
@BoundNumber(byteOrder=LittleEndian) private int x2;
@BoundNumber(byteOrder=LittleEndian) private int y2;
}
您甚至可以使用迷你方程式来引用先前字段中的值来指定大小/长度等。
@BoundList(size="width * height") byte[] pixels;
@BoundNumber(size="nrBits * 2") int value;
哦,它们还提供了条件逻辑,所有这些都在注释中。
您可以使用 从任何 加载数据。只要您知道结构的确切布局,这应该就足够了。DataInputStream
InputStream