readSize method
Считывает число как размер
csz
=0 - специальная упаковка числаcsz
=1 - readUint8csz
=2 - readUint16csz
=3 - readUint32csz
=4 - readUint64
Специальная упаковка числа
Первые биты показывают в скольки байтах записано число
- от
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;
}