123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- var toArr = require('./toArr');
- exports = {
- encode: function(arr) {
- arr = toArr(arr);
- var ret = '';
- for (var i = 0, len = arr.length; i < len; i++) {
- ret += encode(arr[i]);
- }
- return ret;
- },
- decode: function(str) {
- var ret = [];
- var i = 0;
- var len = str.length;
- while (i < len) {
- var value = 0;
- var continuation = false;
- var shift = 0;
- do {
- var digit = charToInt[str[i++]];
- continuation = (digit & VLQ_CONTINUATION_BIT) !== 0;
- digit &= VLQ_BASE_MASK;
- value = value + (digit << shift);
- shift = shift + VLQ_BASE_SHIFT;
- } while (continuation);
- ret.push(fromVLQSigned(value));
- }
- return ret;
- }
- };
- var charToInt = {};
- var intToChar = {};
- var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
- for (var i = 0, len = chars.length; i < len; i++) {
- charToInt[chars[i]] = i;
- intToChar[i] = chars[i];
- }
- var VLQ_BASE_SHIFT = 5;
- var VLQ_BASE = 1 << VLQ_BASE_SHIFT;
- var VLQ_BASE_MASK = VLQ_BASE - 1;
- var VLQ_CONTINUATION_BIT = VLQ_BASE;
- function encode(value) {
- var ret = '';
- value = toVLQSigned(value);
- do {
- var digit = value & VLQ_BASE_MASK;
- value >>>= VLQ_BASE_SHIFT;
- if (value > 0) {
- digit |= VLQ_CONTINUATION_BIT;
- }
- ret += intToChar[digit];
- } while (value > 0);
- return ret;
- }
- function toVLQSigned(value) {
- if (value < 0) {
- return (-value << 1) + 1;
- } else {
- return (value << 1) + 0;
- }
- }
- function fromVLQSigned(value) {
- var negate = (value & 1) === 1;
- value = value >> 1;
- return negate ? -value : value;
- }
- module.exports = exports;
|