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