JavaScript-将数组缓冲区转换为字符串

标签 javascript arraybuffer typed-arrays

这个问题在这里已经有了答案:





Converting between strings and ArrayBuffers

(28 个回答)


6年前关闭。




标题说明了一切。
我有一个看起来像这样的 jquery 序列化数据:

tarid=value&tarname=value&sel=3

我想将它转换为 ArrayBuffer。
在那之后,我还需要将它再次变回原来的形式。
那么我该怎么做呢?

最佳答案

这够了吗?

function stringToArrayBuffer(str){
    if(/[\u0080-\uffff]/.test(str)){
        throw new Error("this needs encoding, like UTF-8");
    }
    var arr = new Uint8Array(str.length);
    for(var i=str.length; i--; )
        arr[i] = str.charCodeAt(i);
    return arr.buffer;
}

function arrayBufferToString(buffer){
    var arr = new Uint8Array(buffer);
    var str = String.fromCharCode.apply(String, arr);
    if(/[\u0080-\uffff]/.test(str)){
        throw new Error("this string seems to contain (still encoded) multibytes");
    }
    return str;
}

还是你需要真正的 UTF-8 编码

编辑:完整的 UTF-8 支持

当心/免责声明:此代码未针对 UTF-8 编码器或解码器的某些外国实现进行测试。它可能会产生错误的结果。

自己测试,在生产中使用它之前!
function stringToArrayBuffer(str){
    if(/[\u0080-\uffff]/.test(str)){
        var arr = new Array(str.length);
        for(var i=0, j=0, len=str.length; i<len; ++i){
            var cc = str.charCodeAt(i);
            if(cc < 128){
                //single byte
                arr[j++] = cc;
            }else{
                //UTF-8 multibyte
                if(cc < 2048){
                    arr[j++] = (cc >> 6) | 192;
                }else{
                    arr[j++] = (cc >> 12) | 224;
                    arr[j++] = ((cc >> 6) & 63) | 128;
                }
                arr[j++] = (cc & 63) | 128;
            }
        }
        var byteArray = new Uint8Array(arr);
    }else{
        var byteArray = new Uint8Array(str.length);
        for(var i = str.length; i--; )
            byteArray[i] = str.charCodeAt(i);
    }
    return byteArray.buffer;
}

function arrayBufferToString(buffer){
    var byteArray = new Uint8Array(buffer);
    var str = "", cc = 0, numBytes = 0;
    for(var i=0, len = byteArray.length; i<len; ++i){
        var v = byteArray[i];
        if(numBytes > 0){
            //2 bit determining that this is a tailing byte + 6 bit of payload
            if((cc&192) === 192){
                //processing tailing-bytes
                cc = (cc << 6) | (v & 63);
            }else{
                throw new Error("this is no tailing-byte");
            }
        }else if(v < 128){
            //single-byte
            numBytes = 1;
            cc = v;
        }else if(v < 192){
            //these are tailing-bytes
            throw new Error("invalid byte, this is a tailing-byte")
        }else if(v < 224){
            //3 bits of header + 5bits of payload
            numBytes = 2;
            cc = v & 31;
        }else if(v < 240){
            //4 bits of header + 4bit of payload
            numBytes = 3;
            cc = v & 15;
        }else{
            //UTF-8 theoretically supports up to 8 bytes containing up to 42bit of payload
            //but JS can only handle 16bit.
            throw new Error("invalid encoding, value out of range")
        }

        if(--numBytes === 0){
            str += String.fromCharCode(cc);
        }
    }
    if(numBytes){
        throw new Error("the bytes don't sum up");
    }
    return str;
}

关于JavaScript-将数组缓冲区转换为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36487636/

相关文章:

javascript - 动态调整图像映射和图像的大小

javascript - 将 Canvas 内容序列化到 ArrayBuffer 并再次反序列化

javascript - ImageData 数组中的索引逻辑是什么?

javascript - 字符串的 SubtleCrypto ArrayBuffer 键

javascript - Google Text-toSpeech - 在前端获取音频文件

Javascript 如何在 CPU Uint8array 上重现 GLSL 浮点矩阵运算

javascript - 读取二进制文件时出错

javascript - 如何扩展元素但保持其位置?

php - 如何在 PHP 中转义这个 JavaScript 变量

javascript - :hover CSS style affecting browser-based behaviour of buttons containing image