readFileSync(aFile).buffer的缓冲区还包含一个正在执行这行代码的JavaScript文件,以及aFile
我在用TypeScript解析.npy文件时遇到了一些问题,结果得到下面这个最小示例:
- 创建一个文件
textfile.txt(给它起个名字并填充你想要的任意内容,在我的例子中为:"testfilecontents") - 运行以下带有文件路径适配的Node.js文件
```typescript import {readFileSync} from "node:fs";
function readHeader(buf) { const view = new DataView(buf); console.log("printing out the buffer char by char:") for(let i = 0; i < view.byteLength; i++) { process.stdout.write(String.fromCharCode(view.getUint8(i))) } } const buffer = readFileSync("testfile.txt").buffer readHeader(buffer) ```
缓冲区不应该只包含 textfile.txt 的内容吗?
上面的脚本会产生如下输出,逐字符打印缓冲区:
/import {readFileSync} from "node:fs";
function readHeader(buf) {
const view = new DataView(buf);
console.log("printing out the buffer char by char:")
for(let i = 0; i < view.byteLength; i++) {
process.stdout.write(String.fromCharCode(view.getUint8(i)))
}
}
const buffer = readFileSync("testfile.txt").buffer
readHeader(buffer)testfilecontents
版本信息:
- Node.js:v24.14.0
- 操作系统:Linux Mint 21.3 Cinnamon
在尝试解析头部时会出现问题,未找到预期的 \X93NUMPY,而是类似如下内容:
{"version":3,"mappings":"kHAAA,OAAQ,WAAY,WAAY,kBA..<shortened>"],"ignoreList":[],"sources":["redacted/src/types.ts"],"sourcesContent":[null]}NUMPYv{'descr': '<i8', 'fortran_order': False, 'shape': (4, 3), }
我注意到,前面的部分其实只是TypeScript文件的映射文件,我用以下内容运行:
NODE_OPTIONS=--max-old-space-size=60000 npx tsx --env-file=.env myFile.ts
随后是.npy文件的真实内容。
为了排除TypeScript这个因素,我把示例改写成纯JavaScript,但问题仍然存在。
我注意到:
- 文本文件很小,但当我记录缓冲区时,它似乎要大得多(8192字节):
ArrayBuffer {
[Uint8Contents]: <2f 00 00 00 00 00 00 00 69 6d 70 6f 72 74 20 7b 72 65 61 64 46 69 6c 65 53 79 6e 63 7d 20 66 72 6f 6d 20 22 6e 6f 64 65 3a 66 73 22 3b 0a 0a 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 48 65 61 64 65 72 28 62 75 66 29 20 7b 0a 20 20 63 6f 6e 73 74 20 76 69 65 77 20 3d 20 6e 65 77 20 44 61 74 61 56 69 65 ... 8092 more bytes>,
[byteLength]: 8192
}
有人能证实这一点吗?
解决方案
TL;DR:缓冲区不应该只包含textfile.txt的内容吗?
不:"This ArrayBuffer is not guaranteed to correspond exactly to the original Buffer"