Bộ mã hóa / giải mã VarInt
Giá trị thập phân
Kết quả VarInt
Chi tiết kỹ thuật
Cách Bộ mã hóa / giải mã VarInt hoạt động
Công cụ làm gì
Công cụ VarInt mã hóa các số nguyên không dấu theo kiểu số nguyên độ dài biến LEB128 kiểu Protobuf và giải mã các luồng VarInt nhị phân trở lại thành danh sách số nguyên. Mỗi giá trị được mã hóa trong 1–10 byte tùy theo độ lớn, với bit cao của mỗi byte cho biết còn byte tiếp theo hay không. Đầu ra được hiển thị dưới dạng mảng byte, hệ thập lục phân hoặc Base64 để dễ nhúng vào các bài kiểm thử và fixture.
Các trường hợp sử dụng phổ biến cho lập trình viên
Các kỹ sư gỡ lỗi payload theo wire-format của Protobuf dùng mã hóa/giải mã VarInt để kiểm tra field tag và giá trị trường số nguyên không dấu mà không cần khởi chạy toàn bộ runtime Protobuf. Nhà phát triển Bitcoin và các tiền mã hóa khác phân tích độ dài script và số lượng giao dịch được mã hóa VarInt. Công cụ cũng hữu ích khi reverse-engineer các giao thức nhị phân tùy biến áp dụng LEB128 vì tính gọn nhẹ với các số nhỏ.
Định dạng dữ liệu, kiểu hoặc biến thể
LEB128 (Little-Endian Base 128) phát ra 7 bit dữ liệu mỗi byte, với bit có trọng số lớn nhất đóng vai trò cờ tiếp tục. Số nhỏ (0–127) dùng một byte; số đến 16.383 dùng hai byte; và cứ thế. Đầu vào chấp nhận các số thập phân được phân tách bằng khoảng trắng, dấu phẩy hoặc xuống dòng. Đầu ra có sẵn ở dạng thập lục phân, Base64 và ký hiệu mảng byte thô. Số nguyên có dấu có thể được mã hóa bằng cách áp dụng biến đổi ZigZag trước (n << 1) ^ (n >> 31).
Các lỗi thường gặp và trường hợp biên
Độ chính xác số của JavaScript tối đa là 2^53 − 1; các giá trị lớn hơn Number.MAX_SAFE_INTEGER không thể được mã hóa an toàn. Các luồng VarInt bị cắt cụt (thiếu byte kết thúc) sẽ giải mã được một phần và trả về lỗi kèm offset. Số âm không thể mã hóa trực tiếp — hãy dùng mã hóa ZigZag trước. Tránh sao chép byte VarInt từ ảnh chụp màn hình nơi phần đệm Base64 có thể đã bị lược bỏ, vì thiếu padding sẽ làm thay đổi ranh giới byte.
Khi nào nên dùng công cụ này thay vì viết mã
Dùng công cụ trên trình duyệt để kiểm tra nhanh các byte wire của Protobuf khi gỡ lỗi hoặc khi viết bài kiểm thử. Để mã hóa trong môi trường production, hãy dùng các thư viện VarInt bản địa theo ngôn ngữ (`varint` trên npm, `binary.varint` trong encoding/binary của Go, `decode_varint` trong google.protobuf.internal của Python) — chúng xử lý streaming, phục hồi lỗi và biến đổi ZigZag trong một lần gọi.