Javascript 如何从ArrayBuffer获取二进制字符串?
在JavaScript中,从ArrayBuffer获取二进制字符串的方法是什么 我不想对字节进行编码,只是将二进制表示形式作为字符串 提前谢谢Javascript 如何从ArrayBuffer获取二进制字符串?,javascript,arraybuffer,Javascript,Arraybuffer,在JavaScript中,从ArrayBuffer获取二进制字符串的方法是什么 我不想对字节进行编码,只是将二进制表示形式作为字符串 提前谢谢 函数string2Bin(s){ function string2Bin(s) { var b = new Array(); var last = s.length; for (var i = 0; i < last; i++) { var d = s.charCodeAt(i); if (d < 128)
函数string2Bin(s){
function string2Bin(s) {
var b = new Array();
var last = s.length;
for (var i = 0; i < last; i++) {
var d = s.charCodeAt(i);
if (d < 128)
b[i] = dec2Bin(d);
else {
var c = s.charAt(i);
alert(c + ' is NOT an ASCII character');
b[i] = -1;
}
}
return b;
}
function dec2Bin(d) {
var b = '';
for (var i = 0; i < 8; i++) {
b = (d%2) + b;
d = Math.floor(d/2);
}
return b;
}
var b=新数组();
var last=s.长度;
对于(变量i=0;i
这将从类型化数组中获得一个二进制字符串
var bitsPerByte = 8;
var array = new Uint8Array([0, 50, 100, 170, 200, 255]);
var string = "";
function repeat(str, num) {
if (str.length === 0 || num <= 1) {
if (num === 1) {
return str;
}
return '';
}
var result = '',
pattern = str;
while (num > 0) {
if (num & 1) {
result += pattern;
}
num >>= 1;
pattern += pattern;
}
return result;
}
function lpad(obj, str, num) {
return repeat(str, num - obj.length) + obj;
}
Array.prototype.forEach.call(array, function (element) {
string += lpad(element.toString(2), "0", bitsPerByte);
});
console.log(string);
在
或者你是在问这个
function ab2str(buf) {
return String.fromCharCode.apply(null, new Uint16Array(buf));
}
注意:以这种方式使用apply
意味着您可以达到参数限制(大约16000个元素左右),然后您将不得不通过数组元素进行循环
在上,以下代码将一致地将
ArrayBuffer
转换为字符串,然后再转换回来,而不会丢失或添加任何额外的字节
函数ArrayBufferToString(缓冲区){
返回BinaryToString(String.fromCharCode.apply(null,Array.prototype.slice.apply(新的Uint8Array(buffer)));
}
函数StringToArrayBuffer(字符串){
返回StringToUint8Array(string).buffer;
}
函数BinaryToString(二进制){
var误差;
试一试{
返回解码组件(转义(二进制));
}捕获(_错误){
错误=_错误;
if(错误实例f URIError){
返回二进制;
}否则{
投掷误差;
}
}
}
函数StringToBinary(字符串){
变量字符,代码,i,isUCS2,len,_i;
len=字符串长度;
字符=[];
isUCS2=false;
对于(i=_i=0;0 len;i=0 255){
isUCS2=true;
chars=null;
打破
}否则{
字符推送(代码);
}
}
如果(isUCS2==true){
返回unescape(encodeURIComponent(string));
}否则{
返回String.fromCharCode.apply(null,Array.prototype.slice.apply(chars));
}
}
函数StringToUint8Array(字符串){
变量二进制,宾伦,缓冲区,字符,i,_i;
二进制=字符串二进制(字符串);
binLen=binary.length;
缓冲区=新阵列缓冲区(binLen);
chars=新的Uint8Array(缓冲区);
对于(i=_i=0;0 binLen;i=0而言,近年来通过添加JavaScript使这一点变得更加简单–下面是一个将Uint8Array转换为二进制编码字符串的单行方法:
const toBinString=(字节)=>
bytes.reduce((str,byte)=>str+byte.toString(2).padStart(8,'0'),“”);
例如:
console.log(toBinString(Uint8Array.from([42100255,0]))
// => '00101010011001001111111100000000'
如果从ArrayBuffer开始,请创建缓冲区的Uint8Array“视图”以传递到此方法:
const view=newuint8array(myArrayBuffer);
console.log(toBinString(view));
资料来源:图书馆()我不完全理解您实际想要完成的转换,您能进一步解释一下您想要什么吗?谢谢。它从fileReader.readAsArrayBuffer和fileReader.readAsBinaryString返回的是什么编码?@aungreadAsBinaryString
只是一个基于个人转换的0和1的字符串双字节。没有“编码”。readAsArrayBuffer
使用您告诉它的任何掩码(即Uint8、Uint16、Uint32等)。ArrayBufferToString()似乎无法将ArrayBuffer/Uint8Array正确转换为二进制字符串。使用PNG文件进行测试时,添加了一些字节,但更改了一些字节。但是,大多数字节都是正确的。我是否出错?我使用FileReader.readAsArrayBuffer()读取PNG文件,然后将其发送到ArrayBufferToString()。此处似乎允许对代码所做的操作进行一些解释
function ab2str(buf) {
return String.fromCharCode.apply(null, new Uint16Array(buf));
}
(String) "abc" -> (ArrayBuffer) -> (String) "abc"
(String) "aΩc" -> (ArrayBuffer) -> (String) "aΩc"
(Uint8Array) [0,1,255] -> (ArrayBuffer) -> (String) -> (Uint8Array) [0,1,255]
(Uint16Array) [0,1,256,65535] -> (ArrayBuffer) -> (String) -> (Uint16Array) [0,1,256,65535]
(Uint32Array) [0,1,256,65536,4294967295] -> (ArrayBuffer) -> (String) -> (Uint32Array) [0,1,256,65536,4294967295]