getVariableEncInt method
Lê um inteiro length‑encoded a partir de startOffset.
O formato length‑encoded é definido pelo primeiro byte:
- Se for < 0xfb, esse próprio byte é o valor.
- Se for 0xfc, lê 2 bytes (uint16).
- Se for 0xfd, lê 3 bytes (uint24).
- Se for 0xfe, lê 8 bytes (uint64).
Retorna um record:
- $1: valor lido como BigInt.
- $2: número total de bytes consumidos (1 para o header, +2/+3/+8, dependendo do caso).
Implementation
(BigInt, int) getVariableEncInt(int startOffset) {
if (startOffset < 0 || startOffset >= lengthInBytes) {
_truncated('a length-encoded integer');
}
final firstByte = getUint8(startOffset);
if (firstByte < 0xfb) {
// Valor direto (ex.: 0x05).
return (BigInt.from(firstByte), 1);
}
if (firstByte == 0xfc) {
if (startOffset > lengthInBytes - 3) {
_truncated('a length-encoded integer');
}
return (BigInt.from(getUint16(startOffset + 1, Endian.little)), 3);
}
if (firstByte == 0xfd) {
if (startOffset > lengthInBytes - 4) {
_truncated('a length-encoded integer');
}
final value = getUint16(startOffset + 1, Endian.little) |
(getUint8(startOffset + 3) << 16);
return (BigInt.from(value), 4);
}
if (firstByte == 0xfe) {
if (startOffset > lengthInBytes - 9) {
_truncated('a length-encoded integer');
}
final low = getUint32(startOffset + 1, Endian.little);
final high = getUint32(startOffset + 5, Endian.little);
return ((BigInt.from(high) << 32) | BigInt.from(low), 9);
}
throw MySQLProtocolException(
"Wrong first byte, while decoding getVariableEncInt",
);
}