簡體   English   中英

如何在node.js中收縮TypedArray uzing zlib?

[英]How to deflate a TypedArray uzing zlib in node.js?

對於一些Int32Array a ,我試過這個:

var d = zlib.deflateSync(new Buffer(a));

但是,當我這樣做

var b = new Int32Array(zlib.inflateSync(d));

我得到的ba不同。

我知道在縮小之前將數組轉換為字符串的想法。 這不是內存效率。

有沒有辦法有效地做到這一點?

這里的主要問題不是放氣和膨脹,因為這兩個動作只是將數據從一個Buffer元素傳輸到另一個Buffer元素,反之亦然。 這里的問題是如何將類型化數組(例如Int32Array )傳輸到Buffer ,以及從Buffer傳輸回類型化數組。 要做到這一點,我們必須在這里處理BufferArrayBuffer和typed數組。

讓我們以Int32Array a開頭:

var a = new Int32Array([3,-2,258]);

如果使用var b = new Buffer(b);直接從這個類型化數組創建一個Buffer var b = new Buffer(b); ,您將獲得一個緩沖區,該緩沖區包含3個字節而不是12個字節( Int32Array每個元素都有4個字節),這意味着您將丟失一些信息。 正確的方法是從ArrayBuffer創建Buffer 你可以這樣做:

var b = new Buffer(a.buffer);

這樣,您將獲得一個包含12個字節的Buffer 現在很容易收縮和膨脹這個緩沖區b

var c = zlib.deflateSync(b);
var d = zlib.inflateSync(c);

現在緩沖區db包含相同的元素。 沒什么特別的。

現在,如果直接從Buffer d創建Int32Array ,您將得到的元素要多4倍,因為Buffer d中的每個字節都將映射到Int32Array一個元素。 要解決這個問題,我們將使用Uint8Array

var e = new Uint8Array(d);

我們使用Uint8Array只是將緩沖區d每個字節映射到類型化數組的一個字節,現在可以訪問該類型化數組的ArrayBuffer 最后一步是從類型為數組e ArrayBuffer創建最終的Int32Array

var f = new Int32Array(e.buffer);

最后我們看到f看起來和a

請注意,上述某些步驟取決於Endianness 如果你在同一台機器上完成所有這些操作,你可以按照上述步驟進行操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM