in hessian2/basic_codec/byte_codec.cc [81:114]
bool Encoder::encode(const std::vector<uint8_t> &data) {
size_t size = data.size();
if (size < 16) {
writer_->writeByte(0x20 + size);
writer_->rawWrite(
absl::string_view(std::move(std::string(data.begin(), data.end()))));
return true;
}
if (size < 1024) {
writer_->writeByte(0x34 + (size >> 8));
writer_->writeByte(size);
writer_->rawWrite(
absl::string_view(std::move(std::string(data.begin(), data.end()))));
return true;
}
uint32_t offset = 0;
while (size > CHUNK_SIZE) {
writer_->writeByte(0x41);
writer_->writeBE<uint16_t>(CHUNK_SIZE);
size -= CHUNK_SIZE;
writer_->rawWrite(absl::string_view(std::move(std::string(
data.begin() + offset, data.begin() + offset + CHUNK_SIZE))));
offset += CHUNK_SIZE;
}
if (size > 0) {
writer_->writeByte(0x42);
writer_->writeBE<uint16_t>(size);
writer_->rawWrite(absl::string_view(
std::move(std::string(data.begin() + offset, data.end()))));
}
return true;
}