我进行了一些搜索,发现问题可能出在新行字符上,该字符在本地和 Heroku 上的处理方式不同,但我不确定在哪里或如何处理它。
我有一个非常基本的应用程序,需要对字符串进行 base64 编码。
代码是非常基本的节点代码
let buff = new Buffer(cics);
let base64data = buff.toString('base64');
以下是结果,它们类似,只是“YQ==”不同
Local
MzQ0YzAxOWMtMWZhMC00ODU0LTlhMjMtOWNiNmYzYTdmMzNkOjlhZThhMWUwLTg2OWItNDg2Yi1iNzFkLWRkMGM1NGQ3NWFhYQ==
Heroku
MzQ0YzAxOWMtMWZhMC00ODU0LTlhMjMtOWNiNmYzYTdmMzNkOjlhZThhMWUwLTg2OWItNDg2Yi1iNzFkLWRkMGM1NGQ3NWFh
有人知道这里可能发生什么事吗?
答案1
好吧,解码它们并看看。
$ 回显'MzQ0YzAxOWMtMWZhMC00ODU0LTlhMjMtOWNiNmYzYTdmMzNkOjlhZThhMWUwLTg2OWItNDg2Yi1iNzFkLWRkMGM1NGQ3NWFhYQ=='| base64 -d |十六进制转储-C 00000000 33 34 34 63 30 31 39 63 2d 31 66 61 30 2d 34 38 |344c019c-1fa0-48| 00000010 35 34 2d 39 61 32 33 2d 39 63 62 36 66 33 61 37 |54-9a23-9cb6f3a7| 00000020 66 33 33 64 3a 39 61 65 38 61 31 65 30 2d 38 36 |f33d:9ae8a1e0-86| 00000030 39 62 2d 34 38 36 62 2d 62 37 31 64 2d 64 64 30 |9b-486b-b71d-dd0| 00000040 63 35 34 64 37 35 61 61 61 |c54d75aaA| 00000049
$ 回显'MzQ0YzAxOWMtMWZhMC00ODU0LTlhMjMtOWNiNmYzYTdmMzNkOjlhZThhMWUwLTg2OWItNDg2Yi1iNzFkLWRkMGM1NGQ3NWFh'| base64 -d |十六进制转储-C 00000000 33 34 34 63 30 31 39 63 2d 31 66 61 30 2d 34 38 |344c019c-1fa0-48| 00000010 35 34 2d 39 61 32 33 2d 39 63 62 36 66 33 61 37 |54-9a23-9cb6f3a7| 00000020 66 33 33 64 3a 39 61 65 38 61 31 65 30 2d 38 36 |f33d:9ae8a1e0-86| 00000030 39 62 2d 34 38 36 62 2d 62 37 31 64 2d 64 64 30 |9b-486b-b71d-dd0| 00000040 63 35 34 64 37 35 61 61 |c54d75aa| 00000048
请注意,Heroku 正在编码一个短一个字节的缓冲区(缺少最后一个字母a
)–或者它的 Base64 编码器存在缺陷,会丢弃不完整的块,而不是正确使用填充。
(作为一种快捷方式,因为 Base64 输出始终由 4 个字符的块组成,所以您可以只解码YQ==
本身。它确实解码为字母a
。)