LINUX.ORG.RU

perl base64


0

1

Не получается на перле раскодировать строку закодированную с помощью base64 -w0 или MIME::Base64::encode($line,"")
Гуглил много и ничего не нашел. Самое странное что закодировать в перле можно, а раскодировать нельзя
Помогите кто чем может )

а врать то зачем?

perl -MMIME::Base64 -E 'say encode_base64 "Hello, World!"'
SGVsbG8sIFdvcmxkIQ==
bash-4.1$ perl -MMIME::Base64 -E 'say decode_base64 "SGVsbG8sIFdvcmxkIQ=="'
Hello, World!
bash-4.1$ _
arsi ★★★★★
()
Ответ на: комментарий от arsi

Хотя правильней будет раскодировать закодированное именно перлом MIME::Base64::encode( <STDIN> ,«» ) На выходе почему-то разные данные получаются

Guest_now
() автор топика
Ответ на: комментарий от Guest_now

> Твоя строка очень короткая, попробуй раскодируй cat /bin/ls | base64 -w0 > ls_b64

bash-4.1$ cat /bin/ls | base64 -w0 | perl -MMIME::Base64 -E 'print decode_base64 <>' >ls_tmp
bash-4.1$ cmp /bin/ls ls_tmp
bash-4.1$ _
arsi ★★★★★
()
$ echo 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 | perl -MMIME::Base64 -e 'while (<>) { chomp($_);my $enc = MIME::Base64::encode($_, ""); my $dec = MIME::Base64::decode($enc); print "E: $enc\nD: $dec\n"; }'
E: MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkw
D: 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890

УМВР, ЧЯДНТ?

kemm
()
Ответ на: комментарий от arsi

Хм, спасибо. Видимо проблема у меня не в декодировании а в кодировании. А как же тогда корректно закодировать ? Я читаю в перле через <STDIN> и вывожу принтом

#!/usr/bin/perl
#
use MIME::Base64;

while (defined($line = <STDIN>))
{
print MIME::Base64::encode($line,eof(STDIN)) ;
};

но строка получается не верная. что же тут не так?

Guest_now
() автор топика
Ответ на: комментарий от Guest_now

о ужас… кто тебя учил так в Base64 кодировать? о_О

кстати, ты бы хоть ман по MIME::Base64 почитал, начиная с «If you want to encode a large file…».

> но строка получается не верная. что же тут не так?

конечно не верная. при кодировании строки, длина которой не кратна трём, в строку попадают терминаторы «=».

arsi ★★★★★
()
Ответ на: комментарий от anonymous

Вообще в питоне например алгоритм реализуется поочередным считыванием и кодированием по 76 байт, так получается одна кодированная строка. Это аналог base64 -w0 . Как такое в перле реализовать, я не понимаю. И задача видимо экзотическая, никто такого не делает. Раскодирование в питоне идет путем считывания и декодирования по 57 байт. На выходе получается готовый файл. Такое впечатление что на перле это реализовать либо невозможно, либо через хз что.

Guest_now
() автор топика
Ответ на: комментарий от Guest_now

> там где «If you want to encode a large file» идут операции с файлами а не с stdin/stdout

ох и дерево…

while (read(STDIN, $buf, 57)) {
    print encode_base64($buf);
}
arsi ★★★★★
()
Ответ на: комментарий от arsi

Вот только не надо сразу ругаться ) Я в перле новичек. Спасибо за подсказку, в результате получил такой рабочий код:

while (read(STDIN, $buf, 57)) {
            $buf1= encode_base64($buf);
            chomp($buf1);
            print $buf1;
    }

Всем спасибо!

Guest_now
() автор топика
Ответ на: комментарий от Guest_now

> в результате получил такой рабочий код

while (read(STDIN, $buf, 57)) {
    print encode_base64($buf, '');
}

хотя скобки можно выбросить и $buf сделать локальным для цикла:

while (read STDIN, my $buf, 57) {
    print encode_base64 $buf, '';
}

arsi ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.