2010-03-04 57 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"); 
    } 
    }