栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用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')));

希望这能对我有所帮助。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/432367.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号