1. ホーム
  2. java

[解決済み] 0x7fのどこが特別なんだ?

2022-02-02 02:39:06

質問

avroフォーマットの仕様書を読み、その実装を理解しようとしています。以下はデコードのためのメソッドです。 長い値 :

  @Override
  public long readLong() throws IOException {
    ensureBounds(10);
    int b = buf[pos++] & 0xff;
    int n = b & 0x7f;
    long l;
    if (b > 0x7f) {
      b = buf[pos++] & 0xff;
      n ^= (b & 0x7f) << 7;
      if (b > 0x7f) {
        b = buf[pos++] & 0xff;
        n ^= (b & 0x7f) << 14;
        if (b > 0x7f) {
          b = buf[pos++] & 0xff;
          n ^= (b & 0x7f) << 21;
          if (b > 0x7f) {
            // only the low 28 bits can be set, so this won't carry
            // the sign bit to the long
            l = innerLongDecode((long)n);
          } else {
            l = n;
          }
        } else {
          l = n;
        }
      } else {
        l = n;
      }
    } else {
      l = n;
    }
    if (pos > limit) {
      throw new EOFException();
    }
    return (l >>> 1) ^ -(l & 1); // back to two's-complement
  }

問題は、なぜ常に 0x7f が、今読んだバイトより少ないのですか?

解決方法は?

これは、ビットパックの一種で、それぞれの最上位ビットが byte は、別の byte を読み取る必要があります。 基本的に、これにより、通常必要とされるよりも少ないバイト数で値をエンコードすることができる。 ただし、数値が大きい場合は、その数値よりも多くの 通常の のバイト数が必要となる。 したがって、これは小さな値を扱うときに成功する。

質問に入ります。 0x7F0111_1111 を2進数で表したものです。 最上位ビットがフラグビットとして使用されていることがわかります。