我正试图用C++重写这个JavaScript base64编码例程(请注意,它是非标准的base64,并且在解码字符串的开头有一个。在C++中按位移动Base64编码功能
这里是JS脚本的例子 - https://jsfiddle.net/km53844e/1/
这里是C++脚本的例子 - http://www.tutorialspoint.com/compile_cpp11_online.php?PID=0Bw_CjBb95KQMZ0d5UHc0enhRbXM
我已张贴下面的JavaScript的base64类。
在JS脚本中,它正确地将CcnK转换为CMlaKA。然而,在C++脚本中,它错误地将其转换为CMlaKr(不知道为什么,它可能与JS脚本中的附加NaN语句有关?
或者是否可能与null终止的字符串在C++脚本吗?我发现,如果我删除此,我得到CMlaKs这仍然是不正确的。
我试着加入以下应对isnans,但它不工作。
if (isnan(char_array_4[1])) {
char_array_4[2] = char_array_4[1] = 64;
} else if (isnan(char_array_4[2])) {
char_array_4[3] = 64;
}
C++代码:
std::string base64_encode(unsigned char const* bytes_to_encode, unsigned int in_len) {
std::string ret;
int i = 0;
int j = 0;
unsigned char char_array_3[3];
unsigned char char_array_4[4];
while (in_len--) {
char_array_3[i++] = *(bytes_to_encode++);
if (i == 3) {
char_array_4[0] = char_array_3[0] & 0x3f;
char_array_4[1] = ((char_array_3[0] & 0x0f) << 2) + ((char_array_3[1] & 0xc0) >> 6);
char_array_4[2] = ((char_array_3[1] & 0x03) << 4) + ((char_array_3[2] & 0xf0) >> 4);
char_array_4[3] = (char_array_3[2] & 0xfc) >> 2;
if (isnan(char_array_4[1])) {
char_array_4[2] = char_array_4[1] = 64;
} else if (isnan(char_array_4[2])) {
char_array_4[3] = 64;
}
for(i = 0; (i < 4) ; i++)
ret += base64_chars[char_array_4[i]];
i = 0;
}
}
if (i)
{
for(j = i; j < 3; j++)
char_array_3[j] = '\0';
char_array_4[0] = char_array_3[0] & 0x3f;
char_array_4[1] = ((char_array_3[0] & 0x0f) << 2) + ((char_array_3[1] & 0xc0) >> 6);
char_array_4[2] = ((char_array_3[1] & 0x03) << 4) + ((char_array_3[2] & 0xf0) >> 4);
char_array_4[3] = (char_array_3[2] & 0xfc) >> 2;
if (isnan(char_array_4[1])) {
char_array_4[2] = char_array_4[1] = 64;
} else if (isnan(char_array_4[2])) {
char_array_4[3] = 64;
}
for (j = 0; (j < i + 1); j++)
ret += base64_chars[char_array_4[j]];
while((i++ < 3))
ret += '=';
}
return ret;
}
JS代码:
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 & 0xf) << 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);
}
};
它是如何base64,如果它有65个值?是不是base65? –
那么base65然后.. –
'isNaN(chr2)'检查意味着相应的位置在输入序列之外。当输入序列的长度不是3的倍数时会发生这种情况。您的C++代码不能正确处理该情况。 – Leon