#define ZIP_DECODE_LENGTH(ptr, encoding, lensize, len) do {
ZIP_ENTRY_ENCODING((ptr), (encoding));
if ((encoding) < ZIP_STR_MASK) {
if ((encoding) == ZIP_STR_06B) {
(lensize) = 1;
(len) = (ptr)[0] & 0x3f;
} else if ((encoding) == ZIP_STR_14B) {
(lensize) = 2; //2字节情况,6位+8位存储长度
(len) = (((ptr)[0] & 0x3f) << 8) | (ptr)[1];
} else if (encoding == ZIP_STR_32B) {
(lensize) = 5; //首字节不存长度,从ptr[1]开始高位
(len) = ((ptr)[1] << 24) | //到低位依次计算
((ptr)[2] << 16) |
((ptr)[3] << 8) |
((ptr)[4]);
} else {
assert(NULL);
}
} else {
(lensize) = 1;
(len) = zipIntSize(encoding);
}
} while(0);
#define ZIP_STR_06B (0 << 6) //0000 0000
#define ZIP_STR_14B (1 << 6) //0100 0000
#define ZIP_STR_32B (2 << 6) //1000 0000
表中为字节数组编码。上面的程序实现了表中编码向长度的转换。1字节,2字节,5字节三种。