簡體   English   中英

Map 二進制緩沖區到 Int16Array 或 Int32Array

[英]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方法來生成numberbigint原語。 它還使您可以更好地控制字節順序, 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.

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