私は以下のデコード/エンコードルーチンを持っています。ただし、エンコーディングが正しく機能していません(コンソールログに "ClaKA"ではなく "CMlaKA"が表示されます)。問題はビットシフトだと思うけど、どこに言えないの?ここでビットコードを使ったjavascriptのbase64エンコーディング
はここ
https://jsfiddle.net/4yfrLv9y/16/
を説明するためのjsfiddleは、私はあなたの実装アルゴリズムを見つけましたが、これが見つかりませんでしたコード(ルーチンは一番下に実行される)
var consoleLine = "<p class=\"console-line\"></p>";
console = {
log: function (text) {
$("#console-log").append($(consoleLine).html(text));
}
};
var Base64 = {
_keyStr: ".ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz=",
encode : function (input) {
var output = [],
chr1, chr2, chr3, enc1, enc2, enc3, enc4,
i = 0;
while (i < input.length) {
chr1 = input[i++];
chr2 = input[i++];
chr3 = input[i++];
enc1 = chr1 & 0x3f;
enc2 = (chr1 >> 6) | ((chr2 & 0x3c) << 2);
enc3 = (chr2 >> 4) | ((chr3 & 0x3) << 4);
enc4 = chr3 >> 2;
if (isNaN(chr2)) {
enc3 = enc4 = 64;
} else if (isNaN(chr3)) {
enc4 = 64;
}
output.push([this._keyStr.charAt(enc1),
this._keyStr.charAt(enc2),
this._keyStr.charAt(enc3),
this._keyStr.charAt(enc4)].join(''));
}
return output.join('');
},
decodeAsArray: function (b) {
var d = this.decode(b),
a = [],
c;
//alert("decoded base64:" + d);
for (c = 0; c < d.length; c++) {
a[c] = d.charCodeAt(c)
}
//alert("returning a");
return a
},
decode: function(input) {
var output = "";
var chr1, chr2, chr3 = "";
var enc1, enc2, enc3, enc4 = "";
var i = 0;
do {
enc1 = this._keyStr.indexOf(input.charAt(i++)) ;
enc2 = this._keyStr.indexOf(input.charAt(i++)) ;
enc3 = this._keyStr.indexOf(input.charAt(i++)) ;
enc4 = this._keyStr.indexOf(input.charAt(i++)) ;
chr1 = (enc1 | ((enc2 & 3) << 6));
chr2 = (enc2 >> 2) | ((enc3 & 0x0F) << 4);
chr3 = (enc3 >> 4) | (enc4 << 2);
output = output + String.fromCharCode(chr1);
if (enc3 != 64) {
output = output + String.fromCharCode(chr2);
}
if (enc4 != 64) {
output = output + String.fromCharCode(chr3);
}
chr1 = chr2 = chr3 = "";
enc1 = enc2 = enc3 = enc4 = "";
} while (i < input.length);
return (output);
}
};
basedecode();
function basedecode(){
//Converts 'CMlaKa to CcnK by base64'
var decoded = "CMlaKA"
//67 99 110 75 0 0 - This is the Byte Array, or ArrayBuffer of CcnK
decoded = Base64.decode(decoded)
console.log(decoded);
}
baseencode();
function baseencode(){
var encoded = [67,99,110,75];// byte array of CcnK
console.log(Base64.encode(encoded) + ' ---- Should be CMlaKA not ClaKA== - why is it different?');
}
IE10よりも低いレベルをサポートしているのでない限り、ブラウザにbase64関数が既に存在する場合は、なぜ再作成するのですか? https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64 –
ブラウザでJSを使用していません... –