Javascript 将二进制缓冲区映射到Int16Array或Int32Array

Javascript 将二进制缓冲区映射到Int16Array或Int32Array,javascript,binary,Javascript,Binary,假设我将二进制文件读入缓冲区对象,如下所示 const fs = require('fs'); var file_content = fs.readFileSync(fileNamePath); 现在假设文件\u内容等于: <Buffer 50 4b 03 04 01 2b b4 52 > 对于Int32Array,我希望: Int32Array(2) [1347093252, 012bb452] 在上面的例子中,我希望在转换为Int16Array时,8个字节将转换为4个Int

假设我将二进制文件读入缓冲区对象,如下所示

const fs = require('fs');
var file_content = fs.readFileSync(fileNamePath);
现在假设文件\u内容等于:

<Buffer 50 4b 03 04 01 2b b4 52 >
对于Int32Array,我希望:

Int32Array(2) [1347093252, 012bb452]
在上面的例子中,我希望在转换为Int16Array时,8个字节将转换为4个Int,因为每个Int需要两个字节。在Int32Array的情况下,我只希望有2个,因为每个都应该占用4个字节

然而,当我做以下事情时:

var int16a = Int16Array.from(file_content);
var int32a = Int32Array.from(file_content);
console.log(int16a, int32a);
输出为:

Int16Array(8) [ 80, 75, 3,  4, 1, 43, 180, 82 ] 
Int32Array(8) [ 80, 75, 3,  4, 1, 43, 180, 82 ]
这样,在这两种情况下,它对每个Int只强制转换一个字节。

不使用,它迭代节点缓冲区的字节,并将它们作为整数放入类型化数组中

取而代之的是,作为


除非必须使存储阵列具有16位类型,否则我更喜欢使用
Buffer
方法,例如
readInt16LE()
readInt32BE()
来生成
number
bigint
原语。它还可以更好地控制字节顺序,
Int16Array
etc使用平台端性。您还可以将最多6字节(48位)的整数读入
数字
原语

使用16位整数的示例缓冲区:

var shorts = [];
for (let offset = 0; offset < file_content.length; offset += 2)
    shorts.push(file_content.readInt16LE(offset));
var-shorts=[];
对于(让偏移量=0;偏移量
对于32位:

var ints = [];
for (let offset = 0; offset < file_content.length; offset += 4)
    ints.push(file_content.readInt32LE(offset));
var ints=[];
对于(让偏移量=0;偏移量
示例6字节:
var six=file\u content.readIntLE(0,6)


注意端点和符号。查看所有函数

那么您的问题是什么?构造类型化数组的代码在哪里?什么不起作用?好吧,我更新了我的问题。问题是,例如,当我执行Int16Array.from()时,它会以Int形式返回缓冲区中的每个字节,而不是实际为我看到的每个(16位)获取2个字节!这是有道理的!:我不确定为什么结果仍然不完全符合预期?例如,当我使用您为Int16Array提供的此方法时,前两个字节0x50和0x4b将更改为值为0x4b50而不是0x504b的int。这样,字节的顺序会因为某种原因而颠倒…@Menas看起来您的计算机与文件中的编码数据具有不同的endianness。您可以使用或
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);
var shorts = [];
for (let offset = 0; offset < file_content.length; offset += 2)
    shorts.push(file_content.readInt16LE(offset));
var ints = [];
for (let offset = 0; offset < file_content.length; offset += 4)
    ints.push(file_content.readInt32LE(offset));