How to get binary string from ArrayBuffer?

前端 未结 4 2101
眼角桃花
眼角桃花 2020-12-08 06:03

What is the way to obtain binary string from ArrayBuffer in JavaScript?

I don\'t want to encode the bytes, just get the binary representation as String.

Tha

4条回答
  •  攒了一身酷
    2020-12-08 06:16

    The following code will consistently convert an ArrayBuffer to a String and back again without losing or adding any additional bytes.

    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));
        }
    }
    
    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;
    }
    

    I tested it by round-tripping the following values in this jsfiddle: http://jsfiddle.net/potatosalad/jrdLV/

    (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]
    

提交回复
热议问题