然后写入然后从文件中读取TypeBuffer会产生意外结果

时间:2014-09-20 03:01:15

标签: javascript node.js file io

运行此代码后:

var arr = new Uint32Array(16);
for (var i=0; i<16; ++i) arr[i] = i;
fs.writeFileSync("arr",new Uint8Array(arr).buffer);
console.log([].slice.call(new Uint32Array(fs.readFileSync("arr"))));

预期输出为:

[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ]

但是,它产生了这个输出:

[ 91, 111, 98, 106, 101, 99, 116, 32, 65, 114, 114, 97, 121, 66, 117, 102, 102, 101, 114, 93 ]

arr文件的hexdump显示:

0000000 5b 6f 62 6a 65 63 74 20 41 72 72 61 79 42 75 66
0000010 66 65 72 5d                                    

为什么生成的输出与预期输出不匹配?

1 个答案:

答案 0 :(得分:1)

TypedArray的{​​{3}}(在这种情况下为Uint8Array)为buffer property,与ArrayBuffer不同。如果您在ArrayBuffer模块期待node.js fs时尝试读取/写入Buffer文件,则无法正常工作。

但是,你可以node.js Buffer。对代码进行最简单的更改,使其按预期工作,只需从Buffer初始化arr,而不是尝试使用.buffer属性:

var arr = new Uint32Array(16);
for (var i=0; i<16; ++i) arr[i] = i;
fs.writeFileSync("arr", new Buffer(arr)); // <-- HERE
console.log([].slice.call(new Uint32Array(fs.readFileSync("arr"))));

输出:

[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ]

并且,为了完整起见,arr文件的十六进制转储如下所示:

0000000 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f