写入然后从文件中读取TypeBuffer会产生意想不到的结果

运行这个代码之后:

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 

为什么产出的产出不符合预期的产出?

TypedArray (本例中为TypedArraybuffer属性是一个ArrayBuffer ,它与node.js Buffer 。 如果在fs模块需要node.js Buffer时尝试读取/写入ArrayBuffer到文件,则不起作用。

但是,您可以在两种方式之间进行转换 。 对代码进行最简单的更改,使其按预期工作,只需简单地从arr初始化一个Buffer ,而不是尝试使用.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文件的hex转储看起来像:

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