在Java中使用C结构

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

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

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

哦,他们还提供条件逻辑,全都是注释。

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

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

java.nio有ByteBuffer,它支持在读取和写入时翻转字节顺序,如果需要的话即时。