0x01 zlib和其他压缩的魔术头
一般来说压缩文件都有个魔术头,用于区分不同的压缩文件对应不同的解压缩算法。
7z文件:
00000000 37 7A BC AF 27 1C 00 03 CD F7 CC 2E 66 6A 33 00 7z集' 枉?fj3
tar.xz文件
00000000 FD 37 7A 58 5A 00 00 04 E6 D6 B4 46 02 00 21 01 ?zXZ 嬷碏 !
zip和apk文件
00000000 50 4B 03 04 14 00 00 00 08 00 A7 AD CF 48 D5 52 PK Л螲誖
rar文件
00000000 52 61 72 21 1A 07 00 CF 90 73 00 00 0D 00 00 00 Rar! ?s
zlib文件
00000000 78 01 ED 9D 0B 94 1C 57 79 E7 AB A6 9F 33 9A 99 x ? ?Wy绔3殭
0x02 zlib在JAVA和c++的不同解压方法
JAVA:
public static byte[] decompress(byte[] compress) throws Exception {
ByteArrayInputStream bais = new ByteArrayInputStream(compress);
InflaterInputStream iis = new InflaterInputStream(bais);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int c = 0;
byte[] buf = new byte[BUFFER_SIZE];
while (true) {
c = iis.read(buf);
if (c == EOF)
break;
baos.write(buf, 0, c);
}
baos.flush();
return baos.toByteArray();
}
C++
#include
#include
#include
#include "zlib.h"
#if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__)
# include
# include
# define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY)
#else
#