这个问题过去已有答案,但我可以肯定地说,至今仍未获得答案。
关于ArrayBuffers的文档几乎都是大体的,更不用说具体的应用程序了。我已经研究了几天,但对此一无所获。
本质上,我需要尝试将从文件读取器(此处:https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsArrayBuffer)获得的ArrayBuffer转换为字符串,然后将该字符串转换回相同的ArrayBuffer。
我已经尝试过这些方法,例如
function ab2str(buf) {
return String.fromCharCode.apply(null, new Uint16Array(buf));
}
function str2ab(str) {
var buf = new ArrayBuffer(str.length*2); // 2 bytes for each char
var bufView = new Uint16Array(buf);
for (var i=0, strLen=str.length; i<strLen; i++) {
bufView[i] = str.charCodeAt(i);
}
return b我得到以下错误:“Uint16Array的字节长度应该是2的倍数”
我还尝试了以下方法
function StringToUint8Array(string) {
var binary, binLen, buffer, chars, i, _i;
binary = StringToBinary(string);
binLen = binary.length;
buffer = new ArrayBuffer(binLen);
chars = new Uint8Array(buffer);
for (i = _i = 0; 0 <= binLen ? _i < binLen : _i > binLen; i = 0 <= binLen ? ++_i : --_i) {
chars[i] = String.prototype.charCodeAt.call(binary, i);
}
return chars;
}
function ArrayBufferToString(buffer) {
return BinaryToString(String.fromCharCode.apply(null, Array.prototype.slice.apply(new Uint8Array(buffer))));
}
function StringToArrayBuffer(string) {
return StringToUint8Array(string).buffer;
}
function BinaryToString(binary) {
var error;
try {
return decodeURIComponent(escape(binary));
} catch (_error) {
error = _error;
if (error instanceof URIError) {
return binary;
} else {
throw error;
}
}
}
function StringToBinary(string) {
var chars, code, i, isUCS2, len, _i;
len = string.length;
chars = [];
isUCS2 = false;
for (i = _i = 0; 0 <= len ? _i < len : _i > len; i = 0 <= len ? ++_i : --_i) {
code = String.prototype.charCodeAt.call(string, i);
if (code > 255) {
isUCS2 = true;
chars = null;
break;
} else {
chars.push(code);
}
}
if (isUCS2 === true) {
return unescape(encodeURIComponent(string));
} else {
return String.fromCharCode.apply(null, Array.prototype.slice.apply(chars));
}
}并收到此错误:已超过最大调用堆栈大小
似乎没有好的方法来进行以下转换: AB --> String || String -> AB
发布于 2016-07-10 19:24:05
有一种使用Blob和FileReader的异步方式。
您可以指定任何有效的编码。
function arrayBufferToString( buffer, encoding, callback ) {
var blob = new Blob([buffer],{type:'text/plain'});
var reader = new FileReader();
reader.onload = function(evt){callback(evt.target.result);};
reader.readAsText(blob, encoding);
}
function stringToArrayBuffer( string, encoding, callback ) {
var blob = new Blob([string],{type:'text/plain;charset='+encoding});
var reader = new FileReader();
reader.onload = function(evt){callback(evt.target.result);};
reader.readAsArrayBuffer(blob);
}
//example:
var buf = new Uint8Array([65,66,67]);
arrayBufferToString(buf, 'UTF-8', console.log.bind(console)); //"ABC"
stringToArrayBuffer('ABC', 'UTF-8', console.log.bind(console)); //[65,66,67]发布于 2020-12-13 13:05:08
现在大多数浏览器都有TextEncoder和TextDecoder,Node有util.TextEncoder和util.TextDecoder。这个WHATWG标准提供了在字节数组(具有buffer属性)和字符串之间进行转换的简单方法:
const str = new TextDecoder().decode(byteArray);
const byteArray = new TextEncoder().encode(str);
const buffer = byteArray.buffer;发布于 2020-10-20 01:15:16
下面是转换函数的TypeScript版本,通过cuixping来补充这个出色的答案
const arrayBufferToString = (buffer: ArrayBuffer, encoding = 'UTF-8'): Promise<string> => {
return new Promise<string>((resolve, reject) => {
const blob = new Blob([buffer], { type: 'text/plain' });
const reader = new FileReader();
reader.onload = (evt) => {
if (evt.target) {
resolve(evt.target.result as string);
} else {
reject(new Error('Could not convert array to string!'));
}
};
reader.readAsText(blob, encoding);
});
};
const stringToArrayBuffer = (text: string, encoding = 'UTF-8'): Promise<ArrayBuffer> => {
return new Promise<ArrayBuffer>((resolve, reject) => {
const blob = new Blob([text], { type: `text/plain;charset=${encoding}` });
const reader = new FileReader();
reader.onload = (evt) => {
if (evt.target) {
resolve(evt.target.result as ArrayBuffer);
} else {
reject(new Error('Could not convert string to array!'));
}
};
reader.readAsArrayBuffer(blob);
});
};https://stackoverflow.com/questions/37234333
复制相似问题