解码node.js中的Base64字符串

Sim*_*oV8 4 javascript base64 decoding node.js

我正在尝试解码表示存储在db中的图像的base64字符串.我在SO上尝试了很多库和解决方案,但我仍然无法正确解码图像.特别是,使用以下代码:

var img = new Buffer(b64, 'base64').toString('ascii');
Run Code Online (Sandbox Code Playgroud)

我得到一个类似的二进制表示,除了第一个字节.这是base64字符串的初始部分:

/9j/4RxVRXhpZgAASUkqAAgAAAANADIBAgAUAAAAqgAAACWIBAABAAAAiwYAABABAgAIAAAAvgAA
Run Code Online (Sandbox Code Playgroud)

以下是原始图像的前50个字节:

ffd8ffe11c5545786966000049492a00080000000d003201020014000000aa00000025880400010000008b06000010010200
Run Code Online (Sandbox Code Playgroud)

这里是我用javascript获得的字符串的前50个字节:

7f587f611c5545786966000049492a00080000000d0032010200140000002a00000025080400010000000b06000010010200
Run Code Online (Sandbox Code Playgroud)

你怎么看,这两个字符串是相同的,除了fisrt 3字节和中间几个字节.
有人可以帮助我理解为什么会这样,以及如何解决它?谢谢

msc*_*dex 9

问题是你试图将二进制数据转换为ASCII,这很可能意味着数据丢失,因为ASCII只包含值0x00-0x7F.因此,当转换发生时,所有字节> 0x7F的上限为0x7F.

如果您这样做,您可以看到数据与原始图像的前50个字节匹配:

console.log(new Buffer(b64, 'base64').toString('hex'));
Run Code Online (Sandbox Code Playgroud)

但是如果你想保持二进制数据不变,只需将它作为Buffer实例保留而不调用.toString(),因为许多使用二进制数据的函数可以处理Buffers(例如fs核心模块).

  • 请注意,新的 Buffer 已被弃用,您应该在日志中看到一条警告:“DeprecationWarning: Buffer() is deprecated due to security and usability issues. Please use the Buffer.alloc(), Buffer.allocUnsafe(), or Buffer.from() 方法代替。” 在上面的 mscdex 示例中使用 Buffer.from(b64, 'base64').toString('hex') (2认同)