FireFox 46.0.1:我正在使用第三方(easyrtc)软件在同级之间发送15KB的Float32Arrays块。 Easyrtc坚持认为数据是可JSON的。不幸的是,JSON.stringify产生的字符串的长度是原始数据的两倍以上:16384字节的数据变为长度为35755的字符串。下面是我的测试代码,后面是控制台输出。如果可以采取什么措施来减小字串大小,该怎么办?有没有办法只发送值(没有键)?我可以使用'replacer'参数仅发送值,如果是,我是否不需要在接收端的相应JSON.parse上使用替换器?

var g_testBufferNBytes = 4096 * 4;
var g_testBuffer = new ArrayBuffer(g_testBufferNBytes);
var g_testBufferView   = new Float32Array(g_testBuffer);
console.log("array byte length " + g_testBuffer.byteLength);
console.log("view byte length " + g_testBufferView.byteLength);
var j = JSON.stringify(g_testBufferView);
console.log("j length " + j.length);
var newBuf = JSON.parse(j);
console.log("newBuf length " + Object.keys(newBuf).length);

安慰:
数组字节长16384
查看字节长度16384
j长度35755
newBuf长度4096

最佳答案


ES6 :假设您的数据在let f32 = g_testBufferView (数组Float32Array)中)-可以通过以下4种方式将其保存为JSON数组:

// code
let f32json = JSON.stringify(f32);
let f32jsonArr = JSON.stringify(Array.from(f32));
let f32base64 = btoa(String.fromCharCode(...(new Uint8Array(f32.buffer))));
let f32base128 = ... // not trivial, look below


// decode
let df32json = new Float32Array(Object.values(JSON.parse(f32json)));
let df32jsonArr = new Float32Array(JSON.parse(f32jsonArr));
let df32base64 = new Float32Array(new Uint8Array([...atob(f32base64)].map(c => c.charCodeAt(0))).buffer);
let df32base128 = ... // not trivial, look below
请注意,Object.values返回按数字键排序的值(请看here)。
这是working example。您还可以使用 base128 进行解码,但在本示例中不使用(不使其复杂化)-here的更多详细信息。
如果您的Float32Array-f32具有4096个等于0.3的元素,则:
  • f32具有16384个字节,
  • f32json(您问题中的j)具有109483字节(比f32大6倍以上)
  • f32jsonArr有81921字节(比f32大5倍以上)
  • f32base64 有21848个字节(比f32大约1.3倍)
  • f32base128有18725字节(比f32
    如果您的Float32Array-f32具有4096个元素(等于1到9的整数),则:
  • f32具有16384个字节- CONST
  • f32json(您问题中的j)具有35755字节(比f32大2倍以上)
  • f32jsonArr具有8193字节(比f32少2倍 SMALLER (sic!))
  • f32base64 有21848个字节- CONST (比f32大约1.3倍)
  • f32base128有18725个字节- CONST (比f32大1.15倍),但chrome将发送约2倍的请求(取决于输入数据)

  • 结论
    我们得到的最小结果与数组值无关(结果大小是恒定的),我们得到的f32base64比输入数组大小大33%。对于f32base128-它包含有效的JSON(字符串),比输入大15%以下,但是发送过程中的镶边会增加此大小(look here-在“更新”部分)。因此,请使用f32base64-这可能是无需更复杂方法即可获得的最小JSON。

    09-28 03:31