LINUX.ORG.RU

Perl+Base64 для БОЛЬШОГО файла


0

0

Задача загнать файл произвольного объёма в base64.
MIME::Base64::encode (как я понял) нормально работает только если ей дать сразу весь файл, что по причине его нескромных размеров проблематично.
Бить на куски не прокатило. Обратно не декодируется.
Можно ли как-то порезать его на куски, чтобы не получалось 'висящих' окончаний строк?

Бей на куски размером кратные 6 байтам. Или напиши свой кодировщик, там алгоритм примитивный.

Legioner ★★★★★
()

а так не пробовал?

perl -MMIME::Base64 -0777 -ne 'print decode_base64($_)' < /tmp/blabla.base64 > /tmp/blabla

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

>упс, тебе наоборот закодировать надо :)... тогда encode соответственно надо юзать.

Я бы попробовал, только это надо сделать по ходу работы скрипта..
Можно, конечно, создать второй скрипт, подключиться к stdin|stdout, скинуть ему, получить обратно.. только вот это не решает одной маленькой проблемы: в encode надо передать сразу весь файл (чего, собственно, и требуется избежать)

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

>Бей на куски размером кратные 6 байтам. Или напиши свой кодировщик, там алгоритм примитивный.

На куски не получается. Пробовал уже. При декодировании там всплывают лишние '\n' после каждого блока.

Кодировщик писать - это крайняя мера. На больших файлах тормозить будет нещадно imho.

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

Получается, получается.

Просто при кодировании куски должны быть кратны 6 байтам, а при декодировании - 8.

$ md5sum largefile
000f92a99e97040b193ef6d7f84ceedd  largefile
$ perl -MMIME::Base64 -ne 'BEGIN {$/ = 60*1024} print encode_base64($_)' < largefile > largefile.base64
$ perl -MMIME::Base64 -ne 'BEGIN {$/ = 80*1024} print decode_base64($_)' < largefile.base64 > largefile.copy
$ md5sum largefile.copy
000f92a99e97040b193ef6d7f84ceedd  largefile.copy
$ ls -la
total 30256
drwxr-xr-x  2     4096 2007-04-09 22:34 .
drwxr-xr-x 51     4096 2007-04-09 22:25 ..
-rw-r--r--  1  9225632 2007-04-09 22:28 largefile
-rw-r--r--  1 12462698 2007-04-09 22:34 largefile.base64
-rw-r--r--  1  9225632 2007-04-09 22:34 largefile.copy

anonymous
()

PerlIO::via::Base64 не поможет?

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

Спасибо.
Как выяснилось ошибка была при чтении исходного файла :(
Юзал read вместо sysread и он там что-то добавлял от себя...
По результатам: при кодировании удобно использовать кратность не 60, а 57 (получаются полные строки) а при декодировании соотв. брать целое число строк.

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