Javascript 解码node.js中的Base64字符串

Javascript 解码node.js中的Base64字符串,javascript,node.js,base64,decoding,Javascript,Node.js,Base64,Decoding,我试图解码一个base64字符串,该字符串表示存储在db中的图像。 我尝试了许多提供的库和解决方案,但仍然无法正确解码图像。特别是,使用以下代码: var img = new Buffer(b64, 'base64').toString('ascii'); 我得到了类似的二进制表示,除了第一个字节。 这是base64字符串的初始部分: /9j/4RxVRXhpZgAASUkqAAgAAAANADIBAgAUAAAAqgAAACWIBAABAAAAiwYAABABAgAIAAAAvgAA 以下

我试图解码一个base64字符串,该字符串表示存储在db中的图像。 我尝试了许多提供的库和解决方案,但仍然无法正确解码图像。特别是,使用以下代码:

var img = new Buffer(b64, 'base64').toString('ascii');
我得到了类似的二进制表示,除了第一个字节。 这是base64字符串的初始部分:

/9j/4RxVRXhpZgAASUkqAAgAAAANADIBAgAUAAAAqgAAACWIBAABAAAAiwYAABABAgAIAAAAvgAA
以下是原始图像的前50个字节:

ffd8ffe11c5545786966000049492a00080000000d003201020014000000aa00000025880400010000008b06000010010200
console.log(Buffer.from(b64, 'base64').toString('hex'));
下面是我使用javascript获得的字符串的前50个字节:

7f587f611c5545786966000049492a00080000000d0032010200140000002a00000025080400010000000b06000010010200

你怎么看,这两个字符串是相同的,除了中间3个字节和中间几个字节。


有人能帮我理解为什么会发生这种情况以及如何解决它吗?感谢

问题在于您试图将二进制数据转换为ASCII,这很可能意味着数据丢失,因为ASCII仅由0x00-0x7F值组成。因此,当转换发生时,所有大于0x7F的字节都被限制在0x7F

如果改为执行此操作,则可以看到数据与原始图像的前50个字节相匹配:

ffd8ffe11c5545786966000049492a00080000000d003201020014000000aa00000025880400010000008b06000010010200
console.log(Buffer.from(b64, 'base64').toString('hex'));

但是,如果您想保持二进制数据的完整性,只需将其作为缓冲区实例保留,而不调用
.toString()
,因为许多处理二进制数据的函数都可以处理缓冲区(例如
fs
核心模块)。

可能重复No,它不是重复。我已经尝试过这个解决方案,但不适用于我。我认为这是一个字符加密问题,但我确信ascii值可以到达0xFF。但是,替换
.toString('hex')
对我来说不起作用(我得到了一个完全不同的字符串),但是删除
.toString()
调用就行了,谢谢!请注意,新缓冲区已被折旧,您应该在日志中看到一条警告:“弃用警告:由于安全性和可用性问题,Buffer()已弃用。请改用Buffer.alloc()、Buffer.allocUnsafe()或Buffer.from()方法。”在上面的msdex示例中,使用Buffer.from(b64,'base64')。toString('hex'))