Вопрос может быть длинным, но я хочу дать как можно больше информации! К сожалению.
Я работаю с 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)
Я нашел несколько связанных с этим проблем здесь и здесь , но я не уверен, каким должен быть мой следующий шаг, чтобы исправить это ...