在Java中使用C结构

Roh*_*hin 13 c java

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

Tre*_*son 8

有一个名为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;
}
Run Code Online (Sandbox Code Playgroud)

或指定字节顺序:

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;
}
Run Code Online (Sandbox Code Playgroud)

您甚至可以使用迷你方程式来引用先前字段中的值来指定大小/长度等.

@BoundList(size="width * height") byte[] pixels;
@BoundNumber(size="nrBits * 2") int value;
Run Code Online (Sandbox Code Playgroud)

哦,他们还提供条件逻辑,所有这些都在注释中.


Joa*_*uer 5

您可以用来DataInputStream从任何加载数据InputStream。只要您知道结构的确切布局,就足够了。


dfa*_*dfa 5

有几个图书馆可以帮助这个领域.最简单的一个(注释驱动程序)肯定是Preon


Bri*_*new 4

Swig将为您处理将 C 结构映射到 Java 对象方面的大量繁琐的重复工作。查看Swig/Java 手册和包装 C 结构的条目。