javascript 在 node.js 中解码 Base64 字符串

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/32426098/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-28 15:15:28  来源:igfitidea点击:

Decode Base64 string in node.js

javascriptnode.jsbase64decoding

提问by SimoV8

I'm trying to decode a base64 string representing an image stored in a db. I tried many libraries and solutions provided on SO, but I'm still unable to decode the image correctly. In particular, using the following code:

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

var img = new Buffer(b64, 'base64').toString('ascii');

I get a similar binary representation, except for the first bytes. This is the initial part of the base64 string:

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

/9j/4RxVRXhpZgAASUkqAAgAAAANADIBAgAUAAAAqgAAACWIBAABAAAAiwYAABABAgAIAAAAvgAA

Here are the first 50 bytes of the original image:

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

ffd8ffe11c5545786966000049492a00080000000d003201020014000000aa00000025880400010000008b06000010010200

And here are the first 50 bytes of the string I get with javascript:

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

7f587f611c5545786966000049492a00080000000d0032010200140000002a00000025080400010000000b06000010010200

How you can see, the two strings are identical except for the fisrt 3 bytes and some few bytes in the middle.
Can somebody help me understand why this is happening and how to solve it? Thanks

你怎么看,这两个字符串是相同的,除了第一个 3 个字节和中间的几个字节。
有人可以帮助我理解为什么会发生这种情况以及如何解决吗?谢谢

回答by mscdex

The problem is that you're trying to convert binary data to ASCII, which most likely than not, will mean loss of data since ASCII only consists of values 0x00-0x7F. So when the conversion takes place, all bytes > 0x7F are capped at 0x7F.

问题是您正在尝试将二进制数据转换为 ASCII,这很可能意味着数据丢失,因为 ASCII 仅包含值 0x00-0x7F。因此,当转换发生时,所有 > 0x7F 的字节都被限制在 0x7F。

If you do this instead, you can see the data matches your first 50 bytes of the original image:

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

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

But if you want to keep the binary data intact, just keep it as a Buffer instance without calling .toString(), as many functions that work with binary data can deal with Buffers (e.g. fscore module).

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