MATLAB java.util.zip.ZipException: неверные длины сохраненных блоков при чтении zraw - PullRequest
1 голос
/ 03 апреля 2019

Вопрос может быть длинным, но я хочу дать как можно больше информации! К сожалению.

Я работаю с MATLAB, и у меня есть файл .zraw, где мои пиксели. Файл .zraw имеет 320.449 байт

Мне удалось прочитать этот файл в MATLAB и получить данные.

[FileName,PathName,FilterIndex] = uigetfile('*.zraw','Select the image file');
dir = strcat(PathName,FileName);

FID = fopen(dir);
elementType = 'uint8';
compressedData = fread(FID, inf, 'uint8=>uint8' );

buffer = java.io.ByteArrayOutputStream();
zlib = java.util.zip.InflaterOutputStream( buffer );
zlib.write( compressedData, 0, numel( compressedData ) );
zlib.close();
data = typecast( buffer.toByteArray(), elementType )';

При выполнении этого кода в MATLAB:

compressedData has 320449x1 uint8 
data has 1515360x1 uint8
buffer is 1x1 ByteArrayOutputStream
zlib is 1x1 InflaterOutputStream
data has all the expected values and I can work with it.

Все отлично работает!

Но теперь , я хотел изменить несколько вещей. При чтении документации MATLAB , fread () имеет больше вызовов.

Я хочу пропустить 2 байта каждого байта. Поскольку файл читается с помощью 'uint8', я мог бы сделать это, написав:

compressedData = fread(FID, inf, 'uint8=>uint8', 2); 

После этого вызова сжатые данные имеют 106,817 байт. Как и следовало ожидать, из-за я хочу прочитать треть файла (320.449)

Теперь пришло время создать буфер и накачать его. Однако, если я напишу те же строки, что и раньше:

buffer = java.io.ByteArrayOutputStream();
zlib = java.util.zip.InflaterOutputStream( buffer );
zlib.write( compressedData, 0, numel( compressedData ) );

Тогда я получаю это исключение:

Возникла исключительная ситуация Java: java.util.zip.ZipException: неверная проверка заголовка at java.util.zip.InflaterOutputStream.write (InflaterOutputStream.java:273)

Я немного искал в документации Inflater . Кажется, мне нужно использовать логическое значение nowarp, чтобы избежать контрольной суммы от zlib.

Итак, я повторяю все, но сейчас:

buffer = java.io.ByteArrayOutputStream();
zlib = java.util.zip.InflaterOutputStream( buffer ,java.util.zip.Inflater(true));
zlib.write( compressedData, 0, numel( compressedData ) );

С этими строками я получаю исключение, в котором застрял:

Возникла исключительная ситуация Java: java.util.zip.ZipException: неверная длина хранимых блоков at java.util.zip.InflaterOutputStream.write (InflaterOutputStream.java:273)

Я нашел несколько связанных с этим проблем здесь и здесь , но я не уверен, каким должен быть мой следующий шаг, чтобы исправить это ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...