ตัวเข้ารหัส / ตัวถอดรหัส VarInt
ค่าทศนิยม
เอาต์พุต VarInt
รายละเอียดทางเทคนิค
ตัวเข้ารหัส / ถอดรหัส VarInt ทำงานอย่างไร
เครื่องมือนี้ทำอะไร
เครื่องมือ VarInt เข้ารหัสจำนวนเต็มแบบไม่ติดลบเป็นจำนวนเต็มความยาวแปรผันสไตล์ LEB128 แบบ Protobuf และถอดรหัสสตรีม VarInt แบบไบนารีกลับเป็นรายการจำนวนเต็ม แต่ละค่าจะถูกเข้ารหัสเป็น 1–10 ไบต์ตามขนาด โดยบิตสูงของทุกไบต์ใช้บอกว่ายังมีไบต์ถัดไปหรือไม่ เอาต์พุตจะแสดงเป็นอาร์เรย์ไบต์ เลขฐานสิบหก หรือ Base64 เพื่อให้นำไปฝังในเทสต์และฟิกซ์เจอร์ได้ง่าย
กรณีการใช้งานทั่วไปของนักพัฒนา
วิศวกรที่ดีบักเพย์โหลด wire-format ของ Protobuf ใช้การเข้ารหัส/ถอดรหัส VarInt เพื่อดูแท็กฟิลด์และค่าฟิลด์จำนวนเต็มแบบไม่ติดลบโดยไม่ต้องเปิดใช้งานรันไทม์ Protobuf เต็มรูปแบบ นักพัฒนา Bitcoin และคริปโทเคอร์เรนซีอื่น ๆ ใช้พาร์สความยาวสคริปต์และจำนวนทรานแซกชันที่เข้ารหัสด้วย VarInt เครื่องมือนี้ยังมีประโยชน์เมื่อทำ reverse-engineering โปรโตคอลไบนารีแบบกำหนดเองที่นำ LEB128 ไปใช้เพราะมีขนาดกะทัดรัดสำหรับตัวเลขขนาดเล็ก
รูปแบบข้อมูล ชนิด หรือรูปแบบย่อย
LEB128 (Little-Endian Base 128) ปล่อยบิตเพย์โหลด 7 บิตต่อไบต์ โดยบิตที่มีนัยสำคัญสูงสุดทำหน้าที่เป็นแฟลกบอกว่ามีไบต์ต่อเนื่องหรือไม่ ตัวเลขขนาดเล็ก (0–127) ใช้ไบต์เดียว; ตัวเลขถึง 16,383 ใช้สองไบต์; และต่อ ๆ ไป อินพุตรับตัวเลขฐานสิบที่คั่นด้วยช่องว่าง จุลภาค หรือขึ้นบรรทัดใหม่ เอาต์พุตมีให้ในรูปแบบเลขฐานสิบหก Base64 และสัญกรณ์อาร์เรย์ไบต์ดิบ จำนวนเต็มแบบมีเครื่องหมายสามารถเข้ารหัสได้โดยใช้การแปลง ZigZag ก่อน (n << 1) ^ (n >> 31)
ข้อผิดพลาดที่พบบ่อยและกรณีขอบ
ความแม่นยำของตัวเลขใน JavaScript สูงสุดที่ 2^53 − 1; ค่าที่มากกว่า Number.MAX_SAFE_INTEGER ไม่สามารถเข้ารหัสได้อย่างปลอดภัย สตรีม VarInt ที่ถูกตัดทอน (ขาดไบต์ตัวจบ) จะถอดรหัสได้เพียงบางส่วนและคืนข้อผิดพลาดที่ระบุออฟเซ็ต ตัวเลขติดลบไม่สามารถเข้ารหัสได้โดยตรง — ให้ใช้ ZigZag encoding ก่อน หลีกเลี่ยงการคัดลอกไบต์ VarInt จากภาพหน้าจอที่อาจตัด padding ของ Base64 ออก เพราะ padding ที่หายไปจะเปลี่ยนขอบเขตของไบต์
เมื่อใดควรใช้เครื่องมือนี้แทนการเขียนโค้ด
ใช้เครื่องมือบนเบราว์เซอร์เพื่อการตรวจดูไบต์ wire ของ Protobuf อย่างรวดเร็วระหว่างการดีบักหรือขณะเขียนเทสต์ สำหรับการเข้ารหัสในโปรดักชัน ให้ใช้ไลบรารี VarInt ของภาษานั้น ๆ (`varint` บน npm, `binary.varint` ใน encoding/binary ของ Go, `decode_varint` ใน google.protobuf.internal ของ Python) ซึ่งรองรับสตรีม การกู้คืนจากข้อผิดพลาด และการแปลง ZigZag ในการเรียกครั้งเดียว