in hessian2/basic_codec/number_codec.cc [99:157]
std::unique_ptr<int32_t> Decoder::decode() {
auto out = std::make_unique<int32_t>();
uint8_t code = reader_->readBE<uint8_t>().second;
// ::= [x80-xbf] # -x10 to x3f
if (code >= 0x80 && code <= 0xbf) {
*out.get() = (code - 0x90);
return out;
}
switch (code) {
// ::= [xc0-xcf] b0 # -x800 to x7ff
case 0xc0:
case 0xc1:
case 0xc2:
case 0xc3:
case 0xc4:
case 0xc5:
case 0xc6:
case 0xc7:
case 0xc8:
case 0xc9:
case 0xca:
case 0xcb:
case 0xcc:
case 0xcd:
case 0xce:
case 0xcf:
if (reader_->byteAvailable() < 1) {
return nullptr;
}
*out.get() = LeftShift<int16_t>(code - 0xc8, 8) +
reader_->readBE<uint8_t>().second;
return out;
// ::= [xd0-xd7] b1 b0 # -x40000 to x3ffff
case 0xd0:
case 0xd1:
case 0xd2:
case 0xd3:
case 0xd4:
case 0xd5:
case 0xd6:
case 0xd7:
if (reader_->byteAvailable() < 2) {
return nullptr;
}
*out.get() = LeftShift<int32_t>(code - 0xd4, 16) +
reader_->readBE<uint16_t>().second;
return out;
// ::= 'I' b3 b2 b1 b0
case 0x49:
if (reader_->byteAvailable() < 4) {
return nullptr;
}
*out.get() = reader_->readBE<int32_t>().second;
return out;
}
return nullptr;
}