使用Javascript检索二进制文件内容,对base64进行编码,然后使用Python对其进行反解码

使用Javascript检索二进制文件内容,对base64进行编码,然后使用Python对其进行反解码,第1张

使用Javascript检索二进制文件内容,对base64进行编码,然后使用Python对其进行反解码

所以我对自己回答-对此感到抱歉-但我认为这对于像我一样迷路的人可能有用;)

所以,你必须使用ArrayBuffer和设置

responseType
您的属性
XMLHttpRequest
对象实例的
arraybuffer
检索字节的原始数组,可以转换为使用下列方便的功能的base64(发现那里,笔者可以在这里祝福):

function base64ArrayBuffer(arrayBuffer) {  var base64    = ''  var encodings = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'  var bytes         = new Uint8Array(arrayBuffer)  var byteLength    = bytes.byteLength  var byteRemainder = byteLength % 3  var mainLength    = byteLength - byteRemainder  var a, b, c, d  var chunk  // Main loop deals with bytes in chunks of 3  for (var i = 0; i < mainLength; i = i + 3) {    // Combine the three bytes into a single integer    chunk = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2]    // Use bitmasks to extract 6-bit segments from the triplet    a = (chunk & 16515072) >> 18 // 16515072 = (2^6 - 1) << 18    b = (chunk & 258048)   >> 12 // 258048   = (2^6 - 1) << 12    c = (chunk & 4032)     >>  6 // 4032     = (2^6 - 1) << 6    d = chunk & 63    // 63       = 2^6 - 1    // Convert the raw binary segments to the appropriate ASCII encoding    base64 += encodings[a] + encodings[b] + encodings[c] + encodings[d]  }  // Deal with the remaining bytes and padding  if (byteRemainder == 1) {    chunk = bytes[mainLength]    a = (chunk & 252) >> 2 // 252 = (2^6 - 1) << 2    // Set the 4 least significant bits to zero    b = (chunk & 3)   << 4 // 3   = 2^2 - 1    base64 += encodings[a] + encodings[b] + '=='  } else if (byteRemainder == 2) {    chunk = (bytes[mainLength] << 8) | bytes[mainLength + 1]    a = (chunk & 64512) >> 10 // 64512 = (2^6 - 1) << 10    b = (chunk & 1008)  >>  4 // 1008  = (2^6 - 1) << 4    // Set the 2 least significant bits to zero    c = (chunk & 15)    <<  2 // 15    = 2^4 - 1    base64 += encodings[a] + encodings[b] + encodings[c] + '='  }  return base64}

所以这是一个工作代码:

var xhr = new XMLHttpRequest();xhr.open('GET', 'http://some.tld/favicon.png', false);xhr.responseType = 'arraybuffer';xhr.onload = function(e) {    console.log(base64ArrayBuffer(e.currentTarget.response));};xhr.send();

这将记录一个表示二进制文件内容的 有效 base64编码的字符串。

编辑: 对于无法访问

ArrayBuffer
btoa()
编码字符失败的旧版浏览器,这是获取任何二进制文件的base64编码版本的另一种方法:

function getBinary(file){    var xhr = new XMLHttpRequest();    xhr.open("GET", file, false);    xhr.overrideMimeType("text/plain; charset=x-user-defined");    xhr.send(null);    return xhr.responseText;}function base64Enpre(str) {    var CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";    var out = "", i = 0, len = str.length, c1, c2, c3;    while (i < len) {        c1 = str.charCodeAt(i++) & 0xff;        if (i == len) { out += CHARS.charAt(c1 >> 2); out += CHARS.charAt((c1 & 0x3) << 4); out += "=="; break;        }        c2 = str.charCodeAt(i++);        if (i == len) { out += CHARS.charAt(c1 >> 2); out += CHARS.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4)); out += CHARS.charAt((c2 & 0xF) << 2); out += "="; break;        }        c3 = str.charCodeAt(i++);        out += CHARS.charAt(c1 >> 2);        out += CHARS.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));        out += CHARS.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6));        out += CHARS.charAt(c3 & 0x3F);    }    return out;}console.log(base64Enpre(getBinary('http://www.google.fr/images/srpr/logo3w.png')));

希望这能对我有所帮助。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5110995.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-17
下一篇 2022-11-17

发表评论

登录后才能评论

评论列表(0条)

保存