2014-09-12 3 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 по умолчанию, целевая аудитория для этого скрипта не знакома с оболочкой.

Редактировать: Многие ответы на этот вопрос были окружены строками, а не действительными числами, было найдено одно решение, но для этого необходимо установить модуль Math :: BaseCalc.

Edit2: По существу, если у меня есть

my $binary_string = "000110"; 

я хотел бы, чтобы он кодируется в base64 (как число), так что она возвращает

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

Когда вы говорите, «по существу двоичный» вы имеете в виду, что это на самом деле двоичный? – abiessu

+0

yes, $ string = "1001011", например, строка имеет только те или нули, каждый символ строки должен быть двоичным битом –

+0

, пока он берет строку и кодирует ее как base64, но обрабатывает ее как число, а не как строка, так как encode_base64 делает –

ответ

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' –

+1

@ Юсуф Али, правильно. И это хорошо, потому что 'A' недопустимо base64. – ikegami

+0

Я попытался с '00000000', который должен возвращать 'A', но does not –

Смежные вопросы