Skip to content

Instantly share code, notes, and snippets.

@sergeevabc
Last active August 29, 2015 14:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sergeevabc/e3e11223d5728f61080d to your computer and use it in GitHub Desktop.
Save sergeevabc/e3e11223d5728f61080d to your computer and use it in GitHub Desktop.
Base85 ZeroMQ encode 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-:+=^!/*?&<>()[]{}@%$#
// https://github.com/noseglid/base85
function z85encode(buffer) {
var enctable = {
0: '0',
1: '1',
2: '2',
3: '3',
4: '4',
5: '5',
6: '6',
7: '7',
8: '8',
9: '9',
10: 'a',
11: 'b',
12: 'c',
13: 'd',
14: 'e',
15: 'f',
16: 'g',
17: 'h',
18: 'i',
19: 'j',
20: 'k',
21: 'l',
22: 'm',
23: 'n',
24: 'o',
25: 'p',
26: 'q',
27: 'r',
28: 's',
29: 't',
30: 'u',
31: 'v',
32: 'w',
33: 'x',
34: 'y',
35: 'z',
36: 'A',
37: 'B',
38: 'C',
39: 'D',
40: 'E',
41: 'F',
42: 'G',
43: 'H',
44: 'I',
45: 'J',
46: 'K',
47: 'L',
48: 'M',
49: 'N',
50: 'O',
51: 'P',
52: 'Q',
53: 'R',
54: 'S',
55: 'T',
56: 'U',
57: 'V',
58: 'W',
59: 'X',
60: 'Y',
61: 'Z',
62: '.',
63: '-',
64: ':',
65: '+',
66: '=',
67: '^',
68: '!',
69: '/',
70: '*',
71: '?',
72: '&',
73: '<',
74: '>',
75: '(',
76: ')',
77: '[',
78: ']',
79: '{',
80: '}',
81: '@',
82: '%',
83: '$',
84: '#'
};
var padding = (buffer.length % 4 === 0) ? 0 : 4 - buffer.length % 4;
var result = '';
for (var i = 0; i < buffer.length; i += 4) {
/* 32 bit number of the current 4 bytes (padded with 0 as necessary) */
var num = ((buffer[i] << 24) >>> 0) + // Shift right to force unsigned number
(((i + 1 > buffer.length ? 0 : buffer[i + 1]) << 16) >>> 0) +
(((i + 2 > buffer.length ? 0 : buffer[i + 2]) << 8) >>> 0) +
(((i + 3 > buffer.length ? 0 : buffer[i + 3]) << 0) >>> 0);
/* Create 5 characters from '!' to 'u' alphabet */
var block = [];
for (var j = 0; j < 5; ++j) {
block.unshift(enctable[num % 85]);
num = Math.floor(num / 85);
}
/* And append them to the result */
result += block.join('');
}
return result.substring(0, result.length - padding);
}
// Alternative (sometimes not working as expected, returns null)
// https://github.com/msealand/z85.node
function z85encode(data) {
if ((data.length % 4) != 0) {
return null;
}
var encoder = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-:+=^!/*?&<>()[]{}@%$#";
var str = "",
byte_nbr = 0,
size = data.length,
value = 0;
while (byte_nbr < size) {
var characterCode;
if (typeof data == "string") {
characterCode = data.charCodeAt(byte_nbr++);
} else {
characterCode = data[byte_nbr++];
}
value = (value * 256) + characterCode;
if ((byte_nbr % 4) == 0) {
var divisor = 85 * 85 * 85 * 85;
while (divisor >= 1) {
var idx = Math.floor(value / divisor) % 85;
str += encoder[idx];
divisor /= 85;
}
value = 0
}
}
return str;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment