如何在Node.js中将二进制bin文件转换为JPEG格式
问题原因
你代码里多余的Buffer转ArrayBuffer操作是导致文件损坏的核心原因:
- Node.js内置的
Buffer本身就是Uint8Array的子类,fs.writeFile原生支持直接写入Buffer类型数据,完全不需要额外转成ArrayBuffer Uint8Array.from(buffer).buffer拿到的是Buffer实例对应的底层ArrayBuffer,若原始Buffer存在字节偏移,这个操作会拿到超出原始Buffer范围的冗余数据,导致写入的文件包含多余内容,自然损坏- 如果你是通过
fs.readFile读取原始.bin文件拿到的data,如果读取时错误指定了utf8之类的文本编码,也会导致原始二进制数据提前被破坏,后续转换也无法恢复
解决方法
你提供的.bin文件开头带有JFIF标识,说明文件本身就是标准JPEG格式,只是后缀名被改为了.bin,不需要做任何格式转码,只要保证二进制内容完整写入就能正常打开,对应两种常见场景的正确代码如下:
场景1:直接读取本地.bin文件后转存为jpeg
读取.bin文件时不要指定任何编码参数,拿到的data本身就是可用的Buffer,直接写入目标文件即可:
const fs = require('fs') // 读取.bin文件时不指定编码,默认返回Buffer fs.readFile('你的源文件.bin', (err, data) => { if (err) return console.log(err) // 直接写入Buffer即可,不需要任何转换 fs.writeFile('id.jpeg', data, (err) => { if (err) return console.log(err) console.log('文件保存成功') }) })
场景2:data是外部传入的二进制字符串
如果你的data是从接口、其他模块拿到的二进制字符串,保留Buffer.from转换逻辑,直接写入生成的Buffer即可:
const fs = require('fs') const buffer = Buffer.from(data, 'binary') fs.writeFile('id.jpeg', buffer, (err) => { if (err) return console.log(err) console.log('文件保存成功') })
内容的提问来源于stack exchange,提问作者Marcin Warzybok
相关产品推荐
相关产品推荐

