javascript:Float32Array的最小JSON.stringify?

javascript:Float32Array的最小JSON.stringify?,javascript,stringify,Javascript,Stringify,FireFox 46.0.1:我正在使用第三方(easyrtc)软件在对等方之间发送15KB的Float32Array块。Easyrtc坚持数据是可JSON的。不幸的是,JSON.stringify生成的字符串长度是原始数据的两倍多:16384字节的数据变成了长度为35755的字符串。下面是我的测试代码,后面是控制台输出。如果我能做些什么来减少stringify的尺寸呢?是否有方法只发送值(无键)?我可以使用'replacer'参数只发送值吗?如果可以,我不需要在接收端相应的JSON.parse

FireFox 46.0.1:我正在使用第三方(easyrtc)软件在对等方之间发送15KB的Float32Array块。Easyrtc坚持数据是可JSON的。不幸的是,JSON.stringify生成的字符串长度是原始数据的两倍多:16384字节的数据变成了长度为35755的字符串。下面是我的测试代码,后面是控制台输出。如果我能做些什么来减少stringify的尺寸呢?是否有方法只发送值(无键)?我可以使用'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 纽伯夫长度4096

ES6:假设您的数据位于
中,让f32=g_testBufferView
(array
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
返回按数字键排序的值(look)

这是。您也可以使用base128do decode,但在本例中我没有使用(为了不使其复杂化)-更多详细信息

如果
Float32Array
-
f32
有4096个元素等于
0.3
,则:

  • f32
    有16384个字节
  • f32json
    j
    )有109483个字节(比
    f32
    大6倍)
  • f32jsonArr
    有81921个字节(比
    f32
    大5倍)
  • f32base64
    有21848个字节(比
    f32
    大约1.3倍)
  • f32base128
    有18725个字节(whis比
    f32
    大2倍)
  • f32jsonArr
    有8193个字节(比
    f32
    小2倍)
  • f32base64
    有21848个字节-常量(比
    f32
    大约1.3倍)

  • f32base128
    有18725个字节-CONST(您到底想做什么?您使用的库似乎有一种直接发送二进制数据的方法。