Javascript 读取并对二进制文件进行base64编码
我试图从文件系统中读取一个二进制文件,然后用JavaScript对其进行base64编码。我正在使用读取数据和找到的base64编码器 我的代码似乎已经接近正常工作了,问题是生成的base64数据是错误的。以下是到目前为止我得到的信息:Javascript 读取并对二进制文件进行base64编码,javascript,jquery,html,file-upload,filereader,Javascript,Jquery,Html,File Upload,Filereader,我试图从文件系统中读取一个二进制文件,然后用JavaScript对其进行base64编码。我正在使用读取数据和找到的base64编码器 我的代码似乎已经接近正常工作了,问题是生成的base64数据是错误的。以下是到目前为止我得到的信息: function saveResource() { var file = $(".resourceFile")[0].files[0]; var reader = new FileReader(); reader.onload = fu
function saveResource() {
var file = $(".resourceFile")[0].files[0];
var reader = new FileReader();
reader.onload = function(evt) {
var fileData = evt.target.result;
var bytes = new Uint8Array(fileData);
var binaryText = '';
for (var index = 0; index < bytes.byteLength; index++) {
binaryText += String.fromCharCode( bytes[index] );
}
console.log(Base64.encode(binaryText));
};
reader.readAsArrayBuffer(file);
};
函数saveResource(){
var file=$(“.resourceFile”)[0]。文件[0];
var reader=new FileReader();
reader.onload=函数(evt){
var fileData=evt.target.result;
var bytes=新的Uint8Array(fileData);
var binaryText='';
对于(变量索引=0;索引
这是我正在测试的文件(它是一个100x100的蓝色正方形):
根据,此文件应编码为:
/9j/4AAQSKZJRGABAAD/2WBDAAGGBCGBQGHBWCJCQKKKQNDASLDBKEW8UH0AHBWGJC4NICISIXWCKDCPLDA和Q0HYC5PTGYPC4ZNDL/2WBDAQKKJCQWLDBGNDRGYIRWHYMJYMJYMJYYYMJYYYMJYYMJYYMJYYYYMJYIYMJYMJJJYLKKKKKKKKKKKKKJJJJJJJJJJJYYKKKKKKKKKKKKKKKKKKKKKKKKK8UKKKKKJJJJJJJJJJJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK2.这一领域的研究是一个新的研究领域的一个研究领域的一个研究领域的一个研究领域的一个研究领域的一个研究领域的一个研究领域的一个研究领域的一个研究领域的一个研究领域的一个研究领域的一个研究领域的一个研究领域的一个研究领域的一个研究领域的一个研究领域是一个研究领域的一个研究领域的一个研究领域的一个研究领域的2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2女青年JZGVMZ2HPANN0DXZ3EHL6GOOEHYAHIIMKPPOULZAXMAOKPAANQKM6WSPEXCBHYMNK0TPU1DBX2N4UPK5EBN6ONQ8VP09FB3+Pn6/9OADABAAIRASKEAWPXYIIIv3E8WKKACIIIIIIIII3WKKACIIIIIIIKKACACIIIKCACIIKCACIIIKKAIKKAIKKAIKKAIKKAIKKAIKKAIKKAIKKAIKKAIKKIIKAIKAIKAIKKAIKKIIKAIKAIKAIKAIKAIKAIKAIKAIKAIKAIKKIIKAIKAIKAIKAIKAIKAIKAIKAIKKKAIKAIKAIKAIKAIKKAIKKOooakkkkkkaciiiGaooakkkaciiIiGaooakkaciiIiGaooakkaciiIiGaooakkaciiIiIiGaooakkaciiIiIiGaookaciiIiIiGaookaciiIiIiGaookaci
…但我从JavaScript中得到的是:
w7/DmMO/W6AEEPGSUYAAAQIAAEAAQAAW7/DMWBDAAGGBCGBQGHBWCJCQDBQNDASLDBKSEW8UH0AHBWGJC4NICIXWCKDCPLDA和Q0HYC5PTGYPC4ZNDQ8Obaembqdqdqdqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqa2.这个词的意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思意思JCGVDv8OEAMK1EqacaebabacaaqibamebwuebabancaaqideqfitekfRb2fxeyiywoefelckhwRhdgqkjm1dBVicorchnmohjCoxxxGzgiynkkqNty3ODK6Q0RfVvv1HzWnkWzWzNgAglQC3rD4ExrCdWwWgWgWgWgHgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgWgw7fDuMO5w7rDv8OaAAwDAQACEQMRAD8Aw7HDiijCosK/CTZDGMKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOAKIWOKoooamkiwookiwookiwookiwookiwookiwookiwookiwookiwookiwookiwookiwookiwookiwookiwookiwooka8o/w5k=
如果我不得不冒险猜测,我会说这个问题与二进制数据中的不可打印字符有关(如果我对纯文本文档进行编码,效果很好)。但解决这个问题的最佳方法是什么
编辑
看起来这可能是base64库本身的问题(如果不是,则是如何将
Uint8Array
解压为库调用的字符串)。如果我改用浏览器的btoa()
函数,并直接将Uint8Array
binaryText
传递给它,就可以了。可惜的是,这项功能并不存在于所有浏览器中。而谷歌则出其不意。我找到了以下代码,它将输入数据作为一个普通的“字节”数组(0到255之间的数字,包括在内;如果将Uint8Array
直接传递给它,也可以正常工作),并将其添加到我使用的库中:
//note: it is assumed that the Base64 object has already been defined
//License: Apache 2.0
Base64.byteToCharMap_ = null;
Base64.charToByteMap_ = null;
Base64.byteToCharMapWebSafe_ = null;
Base64.charToByteMapWebSafe_ = null;
Base64.ENCODED_VALS_BASE =
'ABCDEFGHIJKLMNOPQRSTUVWXYZ' +
'abcdefghijklmnopqrstuvwxyz' +
'0123456789';
/**
* Our default alphabet. Value 64 (=) is special; it means "nothing."
* @type {string}
*/
Base64.ENCODED_VALS = Base64.ENCODED_VALS_BASE + '+/=';
Base64.ENCODED_VALS_WEBSAFE = Base64.ENCODED_VALS_BASE + '-_.';
/**
* Base64-encode an array of bytes.
*
* @param {Array.<number>|Uint8Array} input An array of bytes (numbers with
* value in [0, 255]) to encode.
* @param {boolean=} opt_webSafe Boolean indicating we should use the
* alternative alphabet.
* @return {string} The base64 encoded string.
*/
Base64.encodeByteArray = function(input, opt_webSafe) {
Base64.init_();
var byteToCharMap = opt_webSafe ?
Base64.byteToCharMapWebSafe_ :
Base64.byteToCharMap_;
var output = [];
for (var i = 0; i < input.length; i += 3) {
var byte1 = input[i];
var haveByte2 = i + 1 < input.length;
var byte2 = haveByte2 ? input[i + 1] : 0;
var haveByte3 = i + 2 < input.length;
var byte3 = haveByte3 ? input[i + 2] : 0;
var outByte1 = byte1 >> 2;
var outByte2 = ((byte1 & 0x03) << 4) | (byte2 >> 4);
var outByte3 = ((byte2 & 0x0F) << 2) | (byte3 >> 6);
var outByte4 = byte3 & 0x3F;
if (!haveByte3) {
outByte4 = 64;
if (!haveByte2) {
outByte3 = 64;
}
}
output.push(byteToCharMap[outByte1],
byteToCharMap[outByte2],
byteToCharMap[outByte3],
byteToCharMap[outByte4]);
}
return output.join('');
};
/**
* Lazy static initialization function. Called before
* accessing any of the static map variables.
* @private
*/
Base64.init_ = function() {
if (!Base64.byteToCharMap_) {
Base64.byteToCharMap_ = {};
Base64.charToByteMap_ = {};
Base64.byteToCharMapWebSafe_ = {};
Base64.charToByteMapWebSafe_ = {};
// We want quick mappings back and forth, so we precompute two maps.
for (var i = 0; i < Base64.ENCODED_VALS.length; i++) {
Base64.byteToCharMap_[i] =
Base64.ENCODED_VALS.charAt(i);
Base64.charToByteMap_[Base64.byteToCharMap_[i]] = i;
Base64.byteToCharMapWebSafe_[i] =
Base64.ENCODED_VALS_WEBSAFE.charAt(i);
Base64.charToByteMapWebSafe_[
Base64.byteToCharMapWebSafe_[i]] = i;
}
}
};
//注意:假定已经定义了Base64对象
//许可证:Apache2.0
Base64.byteToCharMap 0=null;
Base64.charToByteMap=空;
Base64.byteToCharMapWebSafe=空;
Base64.charToByteMapWebSafe=空;
Base64.ENCODED\u VALS\u BASE=
“ABCDEFGHIJKLMNOPQRSTUVWXYZ”+
“abcdefghijklmnopqrstuvwxyz”+
'0123456789';
/**
*我们的默认字母表。值64(=)是特殊的;它的意思是“没什么”
*@type{string}
*/
Base64.ENCODED_VALS=Base64.ENCODED_VALS_BASE++/=;
Base64.ENCODED_VALS_WEBSAFE=Base64.ENCODED_VALS_BASE+'-';
/**
*Base64对字节数组进行编码。
*
*@param{Array.|Uint8Array}输入字节数组(带有
*[0,255])中的值进行编码。
*@param{boolean=}opt_webSafe boolean表示我们应该使用
*替代字母表。
*@return{string}base64编码的字符串。
*/
Base64.encodeByteArray=函数(输入,opt_webSafe){
Base64.init_u2;();
var byteToCharMap=opt_webSafe?
Base64.byteToCharMapWebSafe\u0:
Base64.byteToCharMap;
var输出=[];
对于(变量i=0;i>2;
变量outByte2=((字节1和0x03)>4);
变量outByte3=((字节2
my $fh = IO::File->new;
$fh->open("d:/tmp/x.jpg", O_BINARY|O_CREAT|O_RDWR|O_TRUNC) or die $!;
$fh->print(decode_base64("/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBD
AQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIAAhEBAxEB/8QAFQABAQAA
AAAAAAAAAAAAAAAAAAf/xAAUEAEAAAAAAAAAAAAAAAAAAAAA/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAUH/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMR
AD8AjgDcUwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//2Q==
"));
$fh->close;