0.约定和注意事项
本文的数据类型采用“符号+位宽”的表示方式。例如,8位无符号整数类型表示为u8,32位有符号整数类型表示为s32。
本文提供的算法压缩效果并不会非常好,且在某些地方会采用非直观的实现方式。原因会在文章最后说明。
每种算法的压缩后数据的前四字节用于存储压缩头。压缩头的高24位指示原始数据的大小size,低8位用于存储压缩算法的相关属性attr。对于attr,高4位指示采用何种压缩算法(LZ77:1,Huff:2,RL:3),低4位指示Huff算法一次性应当写入多少位。
压缩函数返回压缩后数据的大小,解压缩函数返回原始数据的大小。
两个宏,会在压缩函数中使用:
#define IS_IN_RANGE(p) (p < src + src_size)
#define CHECK_IN_RANGE(p) if (!IS_IN_RANGE(p)) break
本文提供的代码仅适用于32位环境,不要尝试将其用64位编译器编译。代码在以下编译器中编译通过:
tcc version 0.9.27 (i386 Windows)
gcc (MinGW.org GCC-6.3.0-1) 6.3.0
gcc (MinGW-W64 i686-ucrt-mcf-dwarf, built by Brecht Sanders) 13.2.0
不确保提供的代码没有bug。仅测试了一个helloworld的EXE程序以及一张png图片。
本文的数据类型采用“符号+位宽”的表示方式。例如,8位无符号整数类型表示为u8,32位有符号整数类型表示为s32。
本文提供的算法压缩效果并不会非常好,且在某些地方会采用非直观的实现方式。原因会在文章最后说明。
每种算法的压缩后数据的前四字节用于存储压缩头。压缩头的高24位指示原始数据的大小size,低8位用于存储压缩算法的相关属性attr。对于attr,高4位指示采用何种压缩算法(LZ77:1,Huff:2,RL:3),低4位指示Huff算法一次性应当写入多少位。
压缩函数返回压缩后数据的大小,解压缩函数返回原始数据的大小。
两个宏,会在压缩函数中使用:
#define IS_IN_RANGE(p) (p < src + src_size)
#define CHECK_IN_RANGE(p) if (!IS_IN_RANGE(p)) break
本文提供的代码仅适用于32位环境,不要尝试将其用64位编译器编译。代码在以下编译器中编译通过:
tcc version 0.9.27 (i386 Windows)
gcc (MinGW.org GCC-6.3.0-1) 6.3.0
gcc (MinGW-W64 i686-ucrt-mcf-dwarf, built by Brecht Sanders) 13.2.0
不确保提供的代码没有bug。仅测试了一个helloworld的EXE程序以及一张png图片。