Что такого особенного в 0x7f? - PullRequest
0 голосов
/ 08 июня 2018

Я читаю спецификацию формата avro и пытаюсь понять ее реализацию.Вот метод для декодирования long value :

  @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 байт, который мы только что прочитали?

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Это 0b1111111 (127), наибольшее возможное число с неподписанным btye, сохраняя одно для флага.

0 голосов
/ 08 июня 2018

Это форма битовой упаковки, в которой старший бит каждого byte используется для определения, должен ли быть прочитан другой byte.По сути, это позволяет вам кодировать значения в меньшем количестве байтов, чем обычно требуется.Однако есть предостережение о том, что если число большое, то потребуется больше, чем нормальное количество байтов.Следовательно, это успешно работает при работе с небольшими значениями.

Возвращаясь к вашему вопросу, 0x7F - это 0111_1111 в двоичном виде.Вы можете видеть, что старший бит используется как бит флага.

...