2010-03-04 89 views
1

我已經被賦予了從源頭解析一些傳入UDP數據包到適當的Java表示的艱鉅任務。 kicker是數據包內保存的數據不是字節對齊的。爲儘可能使協議儘可能緊湊,有許多位字段指示數據字段的存在或不存在。如何解析Java中的字節數組中的位字段?

例如,在位索引34處,您可能會發現應該轉換爲浮點數的24位字段。比特索引110可以是一個標誌,指示接下來的3個場是每個包含一天的小時,分​​鍾和秒的5和6比特值。 (這些只是由我組成,但代表了規範說明的內容)。這些數據包可能長達幾百比特。

該規範不太可能改變,但完全有可能我會被要求解碼其他類似的數據包格式。

我當然可以根據需要進行位移和掩碼,但是我擔心會發生移位,然後在發現更多數據包格式時淹沒在移位中。

我很想聽聽關於最佳實踐或Java庫的任何建議,這些建議可能會使任務更易於管理。

回答

2

對QR碼進行解碼的過程與在一次讀取幾個位時完全相同,完全不對齊。這是我寫的處理它 - 也許你可以重複使用它。

http://code.google.com/p/zxing/source/browse/trunk/core/src/com/google/zxing/common/BitSource.java

+1

尼斯,+1。一旦評論 - 你的課是**不是線程安全的;爲了讓多線程同時使用*相同的實例需要安全。每個線程需要單獨的實例不是線程安全的。 –

+0

確實,謝謝你的提示。 –

+0

我同意,不知道誰更改了該評論。單獨的線程實例可以安全地使用(即沒有「靜態」成員會混淆),所以我認爲這是至少是預期的。 –

1

這種情況下,我已經開發JBBP library這是訪問Maven中的文件的實例分析來位和解析值的印刷中心 看起來像

public static final void main(final String ... args) throws Exception { 
    try (InputStream inStream = ClassLoader.getSystemClassLoader().getResourceAsStream("somefile.txt")) { 
     class Bits { @Bin(type = BinType.BIT_ARRAY) byte [] bits; } 
     for(final byte b : JBBPParser.prepare("bit [_] bits;",JBBPBitOrder.MSB0).parse(inStream).mapTo(Bits.class).bits)System.out.print(b != 0 ? "1" : "0"); 
    } 
    }