Заметки идущего Технические заметки по веб-технологиям

Numeration - перевод в произвольную систему счисления

Возникла мысль для передачи ID в ajax приложении кодировать числовые значения в 64-ричные. Накидал простенький скрипт. Интересная особенность - на вход можно подавать произвольный алфавит любой длины. Но это неразумно, т.к. при url-кодировании вся экономия сходит на нет. Поэтому имеет смысл использовать алфавит, подобный тому, который используется при Base64 кодировании.

var KhodeN, ku;
KhodeN = {
Utils: {},
};
ku = KhodeN.Utils;
function N() {
this.alphabet =
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+_";
// + 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя' +
//'/\\+-_*=([{}]).,;:!?#$%^&|`"\'~' +
//'<>' +
//'@¦§©«»µ¶¼½¾⅛⅜⅝⅞□▪▫◊●◦♪√∞∫≈≠≡≤≥'+
//'〱〲〳〴〵あぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢ' +
// 'っつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをんゔ'

this.size = this.alphabet.length;

this.encode = function (nNumber, alphabet) {
alphabet = alphabet || this.alphabet;
nNumber = Math.round(nNumber);

var result = [], finish = false, quotient = nNumber, modulo;

while (!finish) {
modulo = quotient % this.size;
quotient = (quotient - modulo) / this.size;
result.push(alphabet.charAt(modulo));
finish = quotient < 1;
}
return result.reverse().join("");
};

this.decode = function (sNumber, alphabet) {
alphabet = alphabet || this.alphabet;
var digits = sNumber.length, result = 0, position, symbol, index;

for (position = 0; position < digits; position += 1) {
symbol = sNumber.charAt(digits - (1 + position));
index = alphabet.indexOf(symbol);
result += index * Math.pow(this.size, position);
}
return result;
};
return this;
}
ku.Numeration = new N();

ku.Numeration.Test = function () {
var result = true, number, str, encoded, decoded, i;
for (i = 0; i < 1e3; i += 1) {
number = Math.round(Math.random() * 1e9);
str = number.toString();
encoded = ku.Numeration.encode(number);
decoded = ku.Numeration.decode(encoded);
if (decoded !== number) {
result = false;
break;
}
console.debug(result, number, "->", encoded, "->", decoded);
}
console.assert( result, "Ошибка дешифровки", number, "->", encoded, "->", decoded );
};

ku.Numeration.Test();

К сожалению, в ходе опытов установил что экономии практически никакой не получается - при передаче параметра он заключается в кавычки, а длина значения уменьшается ненамного. Поэтому скрипт так и останется невостребованным.

Вся настройка заключается в задании алфавита. Если передать 01 - то число переведется в двоичную форму; 01234567 - в восьмеричную, 0123456789ABCDEF - в родную шестнадцатеричную.

Механизм использования можно увидеть в тесте.

Статьи на тему: