2009-08-17 26 views
12

我必須編寫一個Java程序,它將接收來自網絡的消息並將其內容顯示給用戶。問題是我收到的消息只是C結構的二進制轉儲。除此之外,一些消息來自小端機器,一些來自大端機器,而沒有將字段轉換爲網絡字節順序。 我有一種方法是使用JNI並將c結構轉換爲某個XML字符串,然後將此XML字符串序列化爲Java對象。這是一項艱鉅的工作,因爲有大約122個不同的結構,每個結構都包含20多個字段。 我想知道是否有一個圖書館/工具/方法可以使我的工作輕鬆一點?在Java中使用C結構

+0

你有沒有機會使用CAN網絡?如果是這樣,解析DBC文件將是最好的解決方案。 – gramm 2009-08-17 13:28:59

+0

不幸的是它是一個properiatrory電信系統。我正在編寫一個調試工具,用於繪製系統內部模塊之間交換的消息。一種呼叫流程圖。 – Rohin 2009-08-17 13:36:33

回答

4

您可以使用DataInputStream加載來自任何InputStream的數據。只要你知道結構的確切佈局,這應該就足夠了。

5

有幾個圖書館在這方面有所幫助。最簡單的使用方法之一(註釋驅動程序)當然是Preon

+0

doh,打我吧。我需要仔細閱讀之前撰寫一個長的回覆 – 2009-08-17 15:13:56

+0

但你的答案是**更好** – dfa 2009-08-17 15:26:21

1

java.nio具有ByteBuffer,它在讀寫時支持翻轉字節順序,如果需要的話可以在飛行中進行。

8

有一個名爲Preon的圖書館,旨在幫助你完成這種類型的任務:Preon site基本上,他們試圖保留從二進制流中讀取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; 

哦,他們a也提供條件邏輯,全部在註釋中。