1

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

例如,在位索引 34 处,您可能会发现应转换为浮点数的 24 位字段。位索引110可以是指示接下来的3个字段分别是包含一天中的小时、分钟和秒的5位和6位值的标志。(这些只是由我编造的,但代表了规范所说的内容)。这些数据包可能有几百位长。

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

我当然可以根据需要进行位移和掩码,但我担心最终会陷入位移地狱,然后在发现更多数据包格式时淹没其中。

我很想听听关于最佳实践或 Java 库的任何建议,这些建议可能会使任务更易于管理。

4

2 回答 2

2

解码 QR 码与一次读取几个位的练习非常相似,完全不对齐。这是我为处理它而写的——也许你可以重复使用它。

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

于 2010-03-04T21:20:43.007 回答
1

对于这种情况,我开发了JBBP 库,该库可在 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");
    }
  }
于 2015-03-19T08:33:57.903 回答