Perl:将二进制数编码为 base64

Yus*_*Ali 2 binary perl base64 encode

我有一个本质上是二进制的字符串

my $string = "000110";
Run Code Online (Sandbox Code Playgroud)

我一直在尝试使用 encode_base64 但它编码字符串,如果我正确阅读文档

my $j = MIME::Base64->encode_base64($string);
print "$j\n"; # should print 'A'
>> TUlNRTo6QmFzZTY000000
Run Code Online (Sandbox Code Playgroud)

我怎样才能在 perl 中做到这一点?该字符串的长度预计为 ~120 个二进制位。我宁愿不使用默认情况下未安装 perl 的任何模块,此脚本的目标受众不熟悉 shell。

编辑:这个问题的很多答案都围绕字符串,而不是实际数字,我找到了一个解决方案,但它需要安装 Math::BaseCalc 模块。

Edit2:基本上,如果我有

my $binary_string = "000110";
Run Code Online (Sandbox Code Playgroud)

我想让它以 base64 编码(作为数字),所以它返回

>>G  # for this case (binary number 000110 to base64 number = G)
Run Code Online (Sandbox Code Playgroud)

ike*_*ami 5

base64 是一种转换 8 位字节/字符字符串的算法。其他任何东西都必须打包成字节。

您已经有了一个字符串,但通过使用以下内容将 120 位打包成 15 个字节,您可以更节省空间:

my $base64 = encode_base64(pack("B*", $binary), "");
Run Code Online (Sandbox Code Playgroud)

逆运算是

my $binary = unpack("B*", decode_base64($base64));
Run Code Online (Sandbox Code Playgroud)

例如,

$ perl -MMIME::Base64 -E'say encode_base64(pack("B*", $ARGV[0]), "")' \
   0100000101000010
QUI=

$ perl -MMIME::Base64 -E'say unpack("B*", decode_base64($ARGV[0]))' \
   QUI=
0100000101000010
Run Code Online (Sandbox Code Playgroud)

如果您实际上有许多不能被 8 整除的位数,您可以在字符串前加上位数。

my $base64 = encode_base64(pack("CB*", length($binary), $binary), "");
Run Code Online (Sandbox Code Playgroud)

逆运算是

my ($length, $binary) = unpack("CB*", decode_base64($base64));
substr($binary, $length) = "";
Run Code Online (Sandbox Code Playgroud)

  • 不。同样,`base64` 是一种编码 *bytes* 序列的算法。3 个字节 => 4 个 ASCII 字符。(填充用于向上舍入到 3 个字节的倍数。) (4认同)