Perl:将二进制数编码为base64

时间:2014-09-12 17:43:53

标签: perl binary base64 encode

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

my $string = "000110";

如果我正确读取documentation,我一直在尝试使用encode_base64,但会对字符串进行编码。

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

我怎样才能在perl中实现这个目标?该字符串的长度应为~120个二进制位。 我默认不使用任何未安装perl的模块,此脚本的目标受众不熟悉shell。

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

Edit2:基本上,如果我有

my $binary_string = "000110";

我想将它编码为base64(作为数字),因此返回

>>G  # for this case (binary number 000110 to base64 number = G)

1 个答案:

答案 0 :(得分:4)

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

你已经有了一个字符串,但是通过使用以下方法将120位打包成15个字节可以提高空间效率:

my $base64 = encode_base64(pack("B*", $binary), "");

逆操作是

my $binary = unpack("B*", decode_base64($base64));

例如,

$ 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

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

my $base64 = encode_base64(pack("CB*", length($binary), $binary), "");

逆操作是

my ($length, $binary) = unpack("CB*", decode_base64($base64));
substr($binary, $length) = "";