如何从Java中的字节数组中解析位字段?

时间:2010-03-04 21:18:52

标签: java parsing bit-shift

我被赋予了将来自源的一些传入UDP数据包解析为适当的Java表示的艰巨任务。踢球者是数据包中保存的数据不是字节对齐的。为了使协议尽可能紧密,有许多位字段表示数据字段的存在与否。

例如,在位索引34处,您可能会找到应转换为float的24位字段。比特索引110可以是指示接下来的3个字段均为5和6比特值的标志,其包含一天中的小时,分​​钟和秒。 (这些只是由我组成,但代表了规范所说的)。这些数据包可能只有几百位。

规范不太可能改变,但我完全有可能要求解码其他类似的数据包格式。

我当然可以根据需要进行移位和屏蔽,但是当我发现更多的数据包格式时,我担心会在位移地狱中陷入困境然后淹没在其中。

我希望听到有关可能使任务更易于管理的最佳做法或Java库的任何建议。

2 个答案:

答案 0 :(得分:2)

解码QR码与一次读取几个位完全相同,完全不对齐。这是我写的处理它 - 也许你可以重用它。

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

答案 1 :(得分: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");
    }
  }