我正在尝试压缩/解压缩以下文件:Sample of contents of sum(可以下载The Canterbury Corpus)。
当我使用fs.readFile(path, callback)
读取它时,我收到一个缓冲区,我需要将该缓冲区转换为字符串以进行压缩,然后再将其另存为文件。
问题在于Buffer.toString('binary')
似乎正在修改内容。
如果我跑步
console.log('original: ', sumBuffer)
let newBuffer = Buffer.from(sumBuffer.toString('binary'))
console.log('modified: ', newBuffer)
我明白了:
原始值:<缓冲区7f 45 4c 46 01 02 01 00 00 00 00 00 00 00 00 00 00 00 02 00 02 00 00 00 01 00 01 0b 98 00 00 00 34 00 00 91 50 00 00 00 00 00 00 34 00 20 00 05 00 28 00 1a ...>
修改后的:<缓冲区7f 45 4c 46 01 02 01 00 00 00 00 00 00 00 00 00 00 00 02 00 02 00 00 00 01 00 01 0b c2 98 00 00 00 34 00 00 c2 91 50 00 00 00 00 00 34 00 20 00 05 00 28 ...>
在第二个字符中,出现了c2
个字符,以前什么都没有。
modified: <Buffer 7f 45 4c 46 01 02 01 00 00 00 00 00 00 00 00 00 00 02 00 02 00 00 00 01 00 01 0b >>c2<< 98 00 00 00 34 00 00 >>c2<< 91 50 00 00 00 00 00 34 00 20 00 05 00 28 ... >
为什么会这样?我该如何摆脱呢?
谢谢。
答案 0 :(得分:1)
Buffer.from
函数,其字符串作为第一个参数,它使用第二个可选的encoding
参数,默认为utf8
因此,您的代码等同于
let newBuffer = Buffer.from(sumBuffer.toString('binary'), 'utf8');
由于sumBuffer
很明显是二进制的,所以您要做的是
let newBuffer = Buffer.from(sumBuffer.toString('binary'), 'binary');
注意,这与
相同let newBuffer = Buffer.from(sumBuffer);
但是,正如您所指出的,“真实代码”要复杂一些-我只是觉得有必要指出它,以防出现一些笨拙的情况并说:“但是为什么不... 。“:p