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

そのような場合のために、私はMavenセントラルでアクセス可能なJBBPライブラリを開発しました。たとえば、ファイルをビットに解析し、解析された値を出力するのは次のようになります。

  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 に答える