[英]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));
我得到的b
與a
不同。
我知道在縮小之前將數組轉換為字符串的想法。 這不是內存效率。
有沒有辦法有效地做到這一點?
這里的主要問題不是放氣和膨脹,因為這兩個動作只是將數據從一個Buffer
元素傳輸到另一個Buffer
元素,反之亦然。 這里的問題是如何將類型化數組(例如Int32Array
)傳輸到Buffer
,以及從Buffer
傳輸回類型化數組。 要做到這一點,我們必須在這里處理Buffer
, ArrayBuffer
和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);
現在緩沖區d
和b
包含相同的元素。 沒什么特別的。
現在,如果直接從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.