【问题标题】:store a json object in ArrayBuffer在 ArrayBuffer 中存储一个 json 对象
【发布时间】:2016-06-28 13:09:54
【问题描述】:

想在ArrayBuffer中存储一个json对象

function stringToUint(string) {
    var string = btoa(unescape(encodeURIComponent(string))),
        charList = string.split(''),
        uintArray = [];
    for (var i = 0; i < charList.length; i++) {
        uintArray.push(charList[i].charCodeAt(0));
    }
    return new Uint8Array(uintArray);
}

function uintToString(uintArray) {
    var encodedString = String.fromCharCode.apply(null, uintArray),
        decodedString = decodeURIComponent(escape(atob(encodedString)));
    return decodedString;
}
var str = {'x':'aaaa'},
    enc = stringToUint(str),
    dec = uintToString(enc);

console.log(dec.x);

console.log(dec.x); 正在打印 `undefined.我做错了吗? 这里是 jsfiddle http://jsfiddle.net/DQJyX/137/

【问题讨论】:

    标签: javascript arraybuffer


    【解决方案1】:

    因为stringToUint 需要一个字符串,并且将一个对象传递给它会将{'x':'aaaa'} 转换为[Object object] 并返回一个表示该对象对象的数组,因此在调用uintToString 时,该数组被转换回[Object object].

    简单的解决方案是在将对象传递给函数之前使用JSON.stringify 到对象,然后使用JSON.parse 转换为原始对象。

    function stringToUint(string) {
        var string = btoa(unescape(encodeURIComponent(string))),
            charList = string.split(''),
            uintArray = [];
        for (var i = 0; i < charList.length; i++) {
            uintArray.push(charList[i].charCodeAt(0));
        }
        return new Uint8Array(uintArray);
    }
    
    function uintToString(uintArray) {
        var encodedString = String.fromCharCode.apply(null, uintArray),
            decodedString = decodeURIComponent(escape(atob(encodedString)));
        return decodedString;
    }
    var str = {'x':'aaaa'},
        enc = stringToUint(JSON.stringify(str)),
        dec = JSON.parse(uintToString(enc));
        
    document.write(dec.x);

    【讨论】:

    • 我怎样才能从Utils.stringToUint(JSON.stringify(str))得到的返回JSON
    • 使用JSON.parse
    【解决方案2】:

    为了让它工作你需要,在stringToUint函数调用JSON.stringify

    function stringToUint(string) {
        var string = btoa(unescape(JSON.stringify(string))),
            charList = string.split(''),
            uintArray = [];
        for (var i = 0; i < charList.length; i++) {
            uintArray.push(charList[i].charCodeAt(0));
        }
        return new Uint8Array(uintArray);
    }
    
    function uintToString(uintArray) {
        var encodedString = String.fromCharCode.apply(null, uintArray),
            decodedString = decodeURIComponent(escape(atob(encodedString)));
        return decodedString;
    }
    var str = {'x':'aaaa'},
        enc = stringToUint(str),
        dec = uintToString(enc);
    
    console.log(dec);
    

    【讨论】:

      【解决方案3】:

      stringToUint 的代码比benchmark link 快约 40%

      function stringToUint(string) {
        const str = btoa(unescape(encodeURIComponent(string)))
        const uintArray = []
        const len = str.length
      
        let i = -1
      
        while (++i < len) {
          uintArray[i] = str.charCodeAt(i)
        }
      
        return new Uint8Array(uintArray);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-09-03
        • 2019-12-08
        • 1970-01-01
        • 2013-07-18
        • 2013-12-31
        • 1970-01-01
        • 1970-01-01
        • 2017-12-24
        相关资源
        最近更新 更多