[英]Map binary buffer to Int16Array or Int32Array
假設我將二進制文件讀入緩沖區 object,如下行所示
const fs = require('fs');
var file_content = fs.readFileSync(fileNamePath);
現在假設 file_content 等於:
<Buffer 50 4b 03 04 01 2b b4 52 >
在十進制中,這些字節值將是:
<Buffer 80 75 3 4 1 43 180 82 >
這些是 8 個字節。 我需要將它們轉換為一個 int 數組,即 Int16Array 或 Int32Array。
在 Int16Array 的情況下。 我期待以下值:
Int16Array(4) [20555, 772, 299, 46162]
在 Int32Array 的情況下,我期待:
Int32Array(2) [1347093252, 012bb452]
與上面的示例一樣,我希望在轉換為 Int16Array 時,這 8 個字節將僅轉換為 4 個 Ints,因為每個 Int 占用兩個字節。 在 Int32Array 的情況下,我預計只有 2 個,因為每個應該占用 4 個字節。
然而,當我執行以下操作時:
var int16a = Int16Array.from(file_content);
var int32a = Int32Array.from(file_content);
console.log(int16a, int32a);
output 是:
Int16Array(8) [ 80, 75, 3, 4, 1, 43, 180, 82 ]
Int32Array(8) [ 80, 75, 3, 4, 1, 43, 180, 82 ]
這樣在這兩種情況下,它只向每個 Int 轉換一個字節。
不要使用from
,它會迭代節點緩沖區的字節並將它們作為整數放入類型化數組中。
相反, 構造一個類型化數組作為節點Buffer
底層.buffer
的視圖:
const fs = require('fs');
const file_content = fs.readFileSync(fileNamePath);
const int16a = new Int16Array(file_content.buffer, file_content.byteOffset, file_content.length/2);
const int32a = new Int32Array(file_content.buffer, file_content.byteOffset, file_content.length/4);
console.log(int16a, int32a);
除非您必須使存儲數組具有 16 位類型,否則我更喜歡使用諸如readInt16LE()
或readInt32BE()
之類的Buffer
方法來生成number
或bigint
原語。 它還使您可以更好地控制字節順序, Int16Array
等使用平台字節序。 您還可以將最多 6 個字節(48 位)的整數讀入number
原語。
將示例緩沖區用於 16 位整數:
var shorts = [];
for (let offset = 0; offset < file_content.length; offset += 2)
shorts.push(file_content.readInt16LE(offset));
對於 32 位:
var ints = [];
for (let offset = 0; offset < file_content.length; offset += 4)
ints.push(file_content.readInt32LE(offset));
示例 6 個字節: var six = file_content.readIntLE(0, 6);
注意字節順序和符號。 在這里查看所有功能
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.