12345678910111213141516171819202122232425262728293031323334 |
- #!/usr/bin/ruby
- #
- ## https://rosettacode.org/wiki/Variable-length_quantity
- #
- func vlq_encode(num) {
- var t = (0x7F & num)
- var str = t.chr
- while (num >>= 7) {
- t = (0x7F & num)
- str += chr(0x80 | t)
- }
- str.reverse
- }
-
- func vlq_decode(str) {
- var num = ''
- str.each_byte { |b|
- num += ('%07b' % (b & 0x7F))
- }
- Num(num, 2)
- }
-
- var tests = [0, 0xa, 123, 254, 255, 256,
- 257, 65534, 65535, 65536, 65537, 0x1fffff,
- 0x200000]
-
- tests.each { |t|
- var vlq = vlq_encode(t)
- printf("%8s %12s %8s\n", t,
- vlq.bytes.join(':', { "%02X" % _ }), vlq_decode(vlq))
- }
|