進数って聞いて「ハァ?」となる人は、プログラムとは縁のない人かもしれませんが、62進数ってプログラマでも「なんのこっちゃ?」って思う人いるかもしれませんが、そこは以前書いたブログを見て理解してみてください。
PHP「HEX62」
そうや、今回のブログでもそうですが、名前付け失敗しました。
HEXはそもそも16進数なので62進数の場合は「62decimal」でした・・・が、まあそれはソレ!
内容としては悪く無いと思うので、名称はそのうちに返ることにしましょう。
気が向いたら・・・
そして、変換スピードも全く悪くないため、個人的にはこの仕組みをスタンダードにしようかと考えています。
ソースコード
(function(){
var $$={};
/**
* 62進数
**/
$$.hex62 = {
chars:function(){
var str = "";
str += "0123456789";
str += "abcdefghijklmnopqrstuvwxyz";
str += "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
return str;
},
encode:function(num){
var chars = this.chars();
var cn = chars.length;
var str = [];
var a1 , a2;
while (num != 0) {
a1 = parseInt(num / cn);
a2 = num - (a1 * cn);
str.unshift(chars.substr(a2,1));
num = a1;
}
var res = str.join("");
res = (!res)?"0":res;
return res;
},
decode:function(num){
var chars = this.chars();
var char2 = {};
var cn = chars.length;
for (var i=0; i< cn; i++) {
char2[chars[i]] = i;
}
var str = 0;
for (var i=0; i<num.toString().length; i++) {
str += char2[num.substr((i+1)*-1, 1)] * Math.pow(cn, i);
}
return str;
}
};
window.$LIB = $$;
return $$;
})();
実行サンプル
エンコード(整数値->62進数)
$ $LIB.hex62.encode(1234567890);
# 結果
"1ly7vk"
デコード(62進数->整数値)
$ $LIB.hex62.decode("1ly7vk");
# 結果
1234567890
解説
PHPの場合とさほど変わらないコードにしてみました。
charsの箇所を配列ではなく、文字列にして対応した点と、substrの関数の記述方法が違っていたぐらいですね。
62進数は上手く使うとなんちゃって暗号化のような使い方もできる上、WEBにおけるトラフィック量の削減にもなるので、非常に有効な方式かもしれません。
毎回書きますが、本当は64進数にしたかったんですよね・・・記号つかっちゃおうかな?
余談
うるう年生まれの人が、年齢を聞かれた時に、20歳の人だと5歳とかっていうヤツあるじゃないですか。
その応用で、プログラマ的に16進数で言うと、20歳は「14際」ってことになりますね。
ちなみに、15歳の時は「F際」ですけどね・・・
「ハァ?」って言われるでしょう。
多言語対応
0 件のコメント:
コメントを投稿