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。