我正在尝试解码base64编码的二进制内容在JQ使用函数。
当我运行爆炸,然后通过内爆,我希望它返回相同的字符串。但事实并非如此。试试这里:https://jqplay.org/s/Rt8H1qv8VRP
Base64 encoded string: "AQEAAAABAQAyGWRkZBXNWwcAAAAAAQIDBAUGBwgJClIGnj9SBp4/"
JQ: '@base64d | explode | implode | @base64'
Output: "AQEAAAABAQAyGWRkZBXvv71bBwAAAAABAgMEBQYHCAkKUgbvv70/Ugbvv70/"
进一步调试,
@base64d | explode | .[14]
返回65533
在Ubuntu上运行下面的代码,你可以看到[14]字符是315(八进制)== 215(十进制)
$ echo "AQEAAAABAQAyGWRkZBXNWwcAAAAAAQIDBAUGBwgJClIGnj9SBp4/" | base64 -d | od -bc
0000000 001 001 000 000 000 001 001 000 062 031 144 144 144 025 315 133
001 001 001 001 2 031 d d d 025 315 [
0000020 007 000 000 000 000 001 002 003 004 005 006 007 010 011 012 122
a 001 002 003 004 005 006 a b t n R
0000040 006 236 077 122 006 236 077
006 236 ? R 006 236 ?
0000047
为什么JQ返回这个奇怪的65533 (0xFFFD)字符?我错过了什么?
首先,这个问题与explode
或implode
无关。仅使用@base64d | @base64
产生相同的结果。
jq期望用base64编码的字符串是用UTF-8编码的文本。
如果解码的字符串不是UTF-8,则结果是未定义的。
您的输入不是UTF-8。
U+FFFD替换字符是用来标记输入错误的字符。