ArrayBuffer 到 String、String 到 ArrayBuffer 方法

2024-06-21

这个问题过去已经得到了答案,但我肯定地说它仍然没有答案。

一般而言,几乎都有关于 ArrayBuffers 的文档,更不用说特定应用程序了。我已经研究了好几天了,没有任何结果。

本质上,我需要尝试转换从文件读取器获得的 ArrayBuffer(此处:https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsArrayBuffer https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsArrayBuffer) 转换为字符串,然后将该字符串转换回同一个 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 ||字符串 -> AB


现在大多数浏览器都有TextEncoder https://developer.mozilla.org/en-US/docs/Web/API/TextEncoder and TextDecoder https://developer.mozilla.org/en-US/docs/Web/API/TextDecoder,并且节点有util.TextEncoder https://nodejs.org/api/util.html#util_class_util_textencoder and util.TextDecoder https://nodejs.org/api/util.html#util_class_util_textdecoder。该 WHATWG 标准提供了在字节数组(具有buffer属性)和字符串:

const str = new TextDecoder().decode(byteArray);
const byteArray = new TextEncoder().encode(str);
const buffer = byteArray.buffer;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ArrayBuffer 到 String、String 到 ArrayBuffer 方法 的相关文章

随机推荐