2012-06-01 6 views
2

Я использую Transfer-Encoding: chunked для написания ответа HTTP.Perl Разделить двоичные данные на куски с помощью Unpack

Ответ разделен на части с помощью следующих действий:

my $template = "a$buffer_size" x int(length($response)/$buffer_size) . 'a*'; 

foreach my $buffer (unpack $template, $response){ 
    ... 
} 

Это хорошо работает, когда тип контента text/html, но это повреждающих двоичные данные, такие как application/pdf.

Может ли unpack использоваться для разделения двоичных данных на равные длины?

+0

Когда вы говорите, что тип контента вызывает повреждение, подтвердили ли вы, что, пытаясь получить доступ к тем же данным, отправьте их с разными типами MIME? – Dancrumb

+0

Кроме того, какова природа коррупции? – Dancrumb

+0

@ Dancrumb «Коррупция» заключается в том, что файл неправильно помечен как UTF-8, а не ANSI. Странно, если я симулирую 'unpack' с' grep {/ \ S /} split/(.{$ buffer_size})/', все в порядке. Кроме того, логика 'unpack' в порядке, если она выполнена в командной строке (то есть не через mod_perl или ActiveState PerlEx). – xpsd300

ответ

1

Не знаю, почему unpack не подходит в этом контексте, но я наткнулся на решение.

Если я манипулировать ответ с файлом в памяти, unpack работает правильно:

my $resp; 
open (my $fh, '>', \$resp); 
my $fh_old = select($fh); 
print $response; 
close $fh; 
select($fh_old); 
$response = $resp; 

Любое представление о том, почему это работает?

+1

Наконец-то отследил корень проблемы. Файл PDF создавался «на лету» из базы данных юникода. Я преобразовывал широкие символы в 'cp1252', чтобы соответствовать« WinAnsiEncoding »объекта шрифта. Perl переключился в режим 'utf8', когда столкнулся с широким символом. Это привело к сбою 'unpack', поскольку он был настроен на работу в режиме' ascii'. – xpsd300

0

Это прекрасно работает с двоичными данными. Проблема в другом месте. (У вас binmode все соответствующие ручки?)