我正在尝试解码表示存储在数据库中的图像的base64字符串。我尝试了许多SO上提供的库和解决方案,但仍然无法正确解码图像。特别是,使用以下代码:
var img = new Buffer(b64, 'base64').toString('ascii');
除了第一个字节外,我得到了类似的二进制表示形式。这是base64字符串的初始部分:
/9j/4RxVRXhpZgAASUkqAAgAAAANADIBAgAUAAAAqgAAACWIBAABAAAAiwYAABABAgAIAAAAvgAA
这里是原始图像的前50个字节:
ffd8ffe11c5545786966000049492a00080000000d003201020014000000aa00000025880400010000008b06000010010200
这是我使用javascript获得的字符串的前50个字节:
7f587f611c5545786966000049492a00080000000d0032010200140000002a00000025080400010000000b06000010010200
您怎么看,两个字符串相同,除了第一个3个字节和中间的几个字节。有人可以帮助我了解为什么会这样以及如何解决吗?谢谢
问题是您试图将二进制数据转换为ASCII,这很可能会导致数据丢失,因为ASCII仅包含值0x00-0x7F。因此,在进行转换时,所有> 0x7F的字节均以0x7F为上限。
如果您改为这样做,则可以看到数据与原始图像的前50个字节相匹配:
console.log(Buffer.from(b64, 'base64').toString('hex'));
但是如果要保持二进制数据完整无缺,只需将其作为Buffer实例而不用调用.toString()
,因为许多处理二进制数据的函数都可以处理Buffers(例如fs
核心模块)。