Variable-length quantity: Difference between revisions

Add JS version of VLQ
(Add JS version of VLQ)
Line 858:
Original input=128, encoded = [81, 00], decoded=128, OK
Original input=589723405834, encoded = [91, 94, f2, 84, 9c, 0a], decoded=589723405834, OK</pre>
 
=={{header|JavaScript}}==
{{trans|Groovy}}
Based on programmatic experimentation, it breaks at 2147483648 (2^31).
 
<lang javascript>const RADIX = 7;
const MASK = 2**RADIX - 1;
 
const octetify = (n)=> {
if (n >= 2147483648) {
throw new RangeError("Variable Length Quantity not supported for numbers >= 2147483648");
}
const octets = [];
for (let i = n; i != 0; i >>>= RADIX) {
octets.push((((i & MASK) + (octets.empty ? 0 : (MASK + 1)))));
}
octets.reverse();
return octets;
};
 
const deoctetify = (octets)=>
octets.reduce((n, octet)=>
(n << RADIX) + (octet & MASK)
, 0);
 
// Test (assuming Node.js)
 
const assert = require("assert");
const testNumbers = [ 0x200000, 0x1fffff, 1, 127, 128, 2147483647 /*, 589723405834*/ ]
 
testNumbers.forEach((number)=> {
const octets = octetify(number)
console.log(octets);
const got_back_number = deoctetify(octets)
assert.strictEqual(got_back_number, number);
});</lang>
 
=={{header|Julia}}==