[英]how convert binary data in base64 from couchdb attachments
我尝试从我的couchdb服务器获取二进制数据。 但是我可以使用它们。 响应包含一个表示二进制数据的字符串,但是如果我尝试使用btoa函数在base64中进行编码,该函数将给我以下错误:
未捕获的InvalidCharacterError:'btoa'失败:要编码的字符串包含Latin1范围之外的字符。
我知道我可以直接在base64中编码数据,但是我不想要。
$.ajax({
url: "http://localhost:5984/testdb/7d9de7a8f2cab6c0b3409d4495000e3f/img",
headers: {
Authorization: 'Basic ' + btoa("name:password"),
},
success: function(data){
/*console.log(JSON.parse(jsonData));
console.log(imageData);*/
document.getElementById("immagine").src = "Data:image/jpg;base64," + btoa(data);
console.log(data);
}
});
任何想法?
从了解Base64字符串中的每个字符开始
var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');
代表一个数字 ,特别是从0
到63
。 接下来,请考虑此数字范围是可以用6
位写入的所有数字,并且我们通常考虑8
位长的字节 二进制数据 。
现在我们可以得出结论,我们要实现的转换是8
位整数到6
位整数,看起来像这样
xxxxxx xxyyyy yyyyzz zzzzzz
其中每个字母描述该位位于哪个字节 ,空格描述6
位整数之间的间隔。
一旦有了6
位数字,我们就可以简单地转换为char并最终添加=
符号(如果我们需要指示字节数不是3
的倍数(它们也不只是0
))
那么我们该怎么做呢?
var arr8 = 'foobar'; // assuming binary string
var i, // to iterate
s1, s2, s3, s4, // sixes
e1, e2, e3, // eights
b64 = ''; // result
// some code I prepared earlier
for (i = 0; i < arr8.length; i += 3) {
e1 = arr8[i ];
e1 = e1 ? e1.charCodeAt(0) & 255 : 0;
e2 = arr8[i + 1];
e2 = e2 ? e2.charCodeAt(0) & 255 : 0;
e3 = arr8[i + 2];
e3 = e3 ? e3.charCodeAt(0) & 255 : 0;
// wwwwwwxx xxxxyyyy yyzzzzzz
s1 = e1 >>> 2 ;
s2 = ((e1 & 3) << 4) + (e2 >>> 4);
s3 = ((e2 & 15) << 2) + (e3 >>> 6);
s4 = e3 & 63 ;
b64 += chars[s1] + chars[s2];
if (arr8[i + 2] !== undefined)
b64 += chars[s3] + chars[s4];
else if (arr8[i + 1] !== undefined)
b64 += chars[s3] + '=';
else
b64 += '==';
}
// and the result
b64; // "Zm9vYmFy"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.