问题可能很长,但我想提供尽可能多的信息!抱歉。
我正在使用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 documentation后,fread()有更多调用。
我想每个字节跳过2个字节。当使用'uint8'读取文件时,我可以这样写:
compressedData = fread(FID, inf, 'uint8=>uint8', 2);
在此调用之后,compressedData具有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:不正确的标头检查 在java.util.zip.InflaterOutputStream.write(InflaterOutputStream.java:273)
我在Inflater documentation中进行了一些搜索。看来我必须使用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:存储的块长度无效 在java.util.zip.InflaterOutputStream.write(InflaterOutputStream.java:273)