我的 bash 变量中有两块 Base64 数据。 Base64 数据中常见的换行符已被空格替换,并且该变量基本上是一个非常长的单行字符串。
我可以解码变量中包含的两块 Base64 数据,但在尝试执行此操作时我遇到了一些细微差别。我想了解我是否正确地处理了这个问题,或者是否有更好的方法来解码不包含换行符的 Base64 数据。这是我所拥有的:
第一个块有 350 个字符,我可以像这样成功解码它:
echo ${DATA::350} | openssl base64 -d | wc -c
256
第二个块有 5745 个字符,但上述命令不会产生预期结果。 IE:
$ echo {DATA:350} | openssl base64 -d | wc -c
432
但是,如果我把换行符放回去,它就会起作用:
$ echo ${DATA:350} | tr ' ' "\n" | openssl base64 -d | wc -c
4240
我预计存在一些行长度问题,第一个块足够小,可以避免,并且它似乎是所使用的 Base64 解码器的一个功能(两个常见的base64
和openssl base64
,行为不同)。
解码base64
器(而不是openssl base64
)在第一个无效字符(空白)处停止,因此仅解码第一个“行”(48 个字节的输出数据),而 OpenSSL 输出 432 个字符(9 个“行”)。该base64
命令有一个忽略选项垃圾,所以这有效:
$ echo ${DATA:350} | base64 -d -i | wc -c
4240
OpenSSL 解码器似乎没有这样的选项。
另外,删除空白完全适用于base64
但不适用openssl base64
:
$ echo ${DATA:350} | tr -d ' ' | openssl base64 -d | wc -c
400
$ echo ${DATA:350} | tr -d ' ' | base64 -d | wc -c
4240
所以,最后,我替换了换行符并使用了 OpenSSL 解码器,因为无论如何我都需要进一步处理解码后的数据:
$ openssl enc -d -a -in <(echo ${DATA:350} | /usr/bin/tr ' ' "\n") -aes-256-cbc -pass file:<(echo $skey) | ...
但我想明白OpenSSL 可以解码不包含换行符的 base64 数据吗?
答案1
如果你不这样做需要空格openssl
将使用以下选项处理此-A
问题:
所以:
$ ls -l sp2.bmp
-rw-r--r-- 1 sweh sweh 3000054 Apr 21 20:13 sp2.bmp
$ x=$(openssl base64 -A < sp2.bmp)
$ echo "$x" | wc
1 1 4000073
$ echo "$x" | openssl base64 -d -A > res
$ ls -l res
-rw-r--r-- 1 sweh sweh 3000054 Jul 30 10:00 res
$ cmp res sp2.bmp
$
我们可以看到base64数据都在一行,并且可以解码。
man enc
解释该-A
选项。
如果您需要保留空格,那么您需要删除它们(通过转换为'\n'
或删除并使用-A
)。