在 Java 中使用 C 结构

2022-09-04 08:10:46

我必须编写一个Java程序,该程序将从网络接收消息并向用户显示其内容。问题是我收到的消息只是C结构的二进制转储。除此之外,一些消息来自小端机,一些来自大端机,而没有将字段转换为网络字节顺序。我的一种方法是使用JNI并将c结构转换为某个XML字符串,然后将此XML字符串反序列化为Java对象。这是一项艰巨的工作,因为大约有122种不同的结构,每个结构都包含20多个字段。我想知道是否有一个库/工具/方法可以让我的工作变得容易一些?


答案 1

有一个名为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;

哦,它们还提供了条件逻辑,所有这些都在注释中。


答案 2

您可以使用 从任何 加载数据。只要您知道结构的确切布局,这应该就足够了。DataInputStreamInputStream


推荐