运行此代码后:
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
为什么生成的输出与预期输出不匹配?
答案 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