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)
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)