2014-09-12 67 views
1

我有一個字符串,它本質上是二元的Perl:編碼的二進制數爲base64

my $string = "000110"; 

我一直在嘗試使用encode_base64但編碼字符串,如果即時通訊正確讀取documentation

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

當你說「基本上是二進制」你的意思是它實際上是二進制? – abiessu 2014-09-12 17:46:04

+0

是的,例如$ string =「1001011」,所以字符串只有1或0,字符串的每個字符都是二進制位 – 2014-09-12 17:46:55

+0

,只要它接受字符串並將其編碼爲base64即可作爲一個數字,而不是像encode_base64那樣的字符串 – 2014-09-12 17:50:47

回答

3

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) = ""; 
+0

'my $ base64 = encode_base64 pack'B *',「00000000」;'返回'AA =='不''A' – 2014-09-12 17:54:31

+1

@Yusuf Ali,正確。這是一件好事,因爲'A'不是有效的base64。 – ikegami 2014-09-12 17:56:04

+0

我試過'00000000',應該返回'A',但不是 – 2014-09-12 17:56:58

相關問題