readSize method

int readSize([
  1. int csz = 0
])

Считывает число как размер

Специальная упаковка числа

Первые биты показывают в скольки байтах записано число

  • от 0 до 0x7F - 1 байт (первые биты = 0xxxxxxx)
  • от 0x80 до 0x3FFF - 2 байта (первые биты = 10xxxxxx)
  • от 0x4000 до 0x1FFFFF - 3 байта (первые биты = 110xxxxx)
  • от 0x200000 до 0x0FFFFFFF - 4 байта (первые биты = 1110xxxx)
  • от 0x10000000 до 0x07FFFFFFFF - 5 байт (первые биты = 11110xxx)
  • от 0x0800000000 до 0x03FFFFFFFFFF - 6 байт (первые биты = 111110xx)
  • от 0x040000000000 до 0x01FFFFFFFFFFFF - 7 байт (первые биты = 1111110x)
  • от 0x02000000000000 до 0x00FFFFFFFFFFFFFF - 8 байт (первые байт = 0xFE)
  • от 0x0100000000000000 до 0xFFFFFFFFFFFFFFFF - 9 байт (первые байт = 0xFF)

Implementation

@pragma('vm:prefer-inline')
@pragma('dart2js:tryInline')
int readSize([int csz = 0]) {
  assert(csz >= 0 && csz <= 4, 'CSZ incorrect');
  switch (csz) {
    case 0:
      final byte = readUint8();
      if (byte & 0x80 == 0) return byte;
      var a = readUint8();
      if (byte & 0xC0 == 0x80) {
        return ((byte ^ 0x80) << 8) | a;
      }
      a = readUint8() | (a << 8);
      if (byte & 0xE0 == 0xC0) {
        return ((byte ^ 0xC0) << 16) | a;
      }
      a = readUint8() | (a << 8);
      if (byte & 0xF0 == 0xE0) {
        return ((byte ^ 0xE0) << 24) | a;
      }
      a = readUint8() | (a << 8);
      if (byte & 0xF8 == 0xF0) {
        return ((byte ^ 0xF0) << 32) | a;
      }
      a = readUint8() | (a << 8);
      if (byte & 0xFC == 0xF8) {
        return ((byte ^ 0xF8) << 40) | a;
      }
      a = readUint8() | (a << 8);
      if (byte & 0xFE == 0xFC) {
        return ((byte ^ 0xFC) << 48) | a;
      }
      a = readUint8() | (a << 8);
      if (byte == 0xFE) {
        return ((byte ^ 0xFE) << 56) | a;
      }
      return readUint8() | (a << 8);
    case 1:
      return readUint8();
    case 2:
      return readUint16();
    case 3:
      return readUint32();
    case 4:
      return readUint64();
  }
  return -1;
}