哪位有gzip1.2.4或更高压缩算法的代码,谢谢 不要 gzip.org的,因为下载下来没看懂:(最好是写成像zlib那样的,只用一个函数就搞定最好了。(注,zlib只有1.1.4,这个版本不能用)谢谢了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://member.netease.com/~inetsoft/downloads/sourcecode/zip/gz124src.zip zlib最新的是1.2.1gzip.org上面的就是gzip 1.2.4,你不要这个要什么?为什么zlib 1.1.4不能用?我可以编译,它带了一个例子minigzip,可以参考一下要找更高的压缩算法,就用bzip2吧http://sources.redhat.com/bzip2/ static unsigned _do_compress (byte *in, unsigned in_len, byte *out, unsigned *out_len){ static long wrkmem [16384L]; register byte *ip; byte *op; byte *in_end = in + in_len; byte *ip_end = in + in_len - 13; byte *ii; byte **dict = (byte **)wrkmem; op = out; ip = in; ii = ip; ip += 4; for(;;) { register byte *m_pos; unsigned m_off; unsigned m_len; unsigned dindex; dindex = ((0x21*(((((((unsigned)(ip[3])<<6)^ip[2])<<5)^ip[1])<<5)^ip[0]))>>5) & 0x3fff; m_pos = dict [dindex]; if(((unsigned)m_pos < (unsigned)in) || (m_off = (unsigned)((unsigned)ip-(unsigned)m_pos) ) <= 0 || m_off > 0xbfff) goto literal; if(m_off <= 0x0800 || m_pos[3] == ip[3]) goto try_match; dindex = (dindex & 0x7ff ) ^ 0x201f; m_pos = dict[dindex]; if((unsigned)(m_pos) < (unsigned)(in) || (m_off = (unsigned)( (int)((unsigned)ip-(unsigned)m_pos))) <= 0 || m_off > 0xbfff) goto literal; if (m_off <= 0x0800 || m_pos[3] == ip[3]) goto try_match; goto literal;try_match: if(*(unsigned short*)m_pos == *(unsigned short*)ip && m_pos[2]==ip[2]) goto match;literal: dict[dindex] = ip; ++ip; if (ip >= ip_end) break; continue;match: dict[dindex] = ip; if(ip - ii > 0) { register unsigned t = ip - ii; if (t <= 3) op[-2] |= (byte)t; else if(t <= 18) *op++ = (byte)(t - 3); else { register unsigned tt = t - 18; *op++ = 0; while(tt > 255) { tt -= 255; *op++ = 0; } *op++ = (byte)tt; } do *op++ = *ii++; while (--t > 0); } ip += 3; if(m_pos[3] != *ip++ || m_pos[4] != *ip++ || m_pos[5] != *ip++ || m_pos[6] != *ip++ || m_pos[7] != *ip++ || m_pos[8] != *ip++ ) { --ip; m_len = ip - ii; if(m_off <= 0x0800 ) { --m_off; *op++ = (byte)(((m_len - 1) << 5) | ((m_off & 7) << 2)); *op++ = (byte)(m_off >> 3); } else if (m_off <= 0x4000 ) { -- m_off; *op++ = (byte)(32 | (m_len - 2)); goto m3_m4_offset; } else { m_off -= 0x4000; *op++ = (byte)(16 | ((m_off & 0x4000) >> 11) | (m_len - 2)); goto m3_m4_offset; } } else { { byte *end = in_end; byte *m = m_pos + 9; while (ip < end && *m == *ip) m++, ip++; m_len = (ip - ii); } if(m_off <= 0x4000) { --m_off; if (m_len <= 33) *op++ = (byte)(32 | (m_len - 2)); else { m_len -= 33; *op++=32; goto m3_m4_len; } } else { m_off -= 0x4000; if(m_len <= 9) *op++ = (byte)(16|((m_off & 0x4000) >> 11) | (m_len - 2)); else { m_len -= 9; *op++ = (byte)(16 | ((m_off & 0x4000) >> 11));m3_m4_len: while (m_len > 255) { m_len -= 255; *op++ = 0; } *op++ = (byte)m_len; } }m3_m4_offset: *op++ = (byte)((m_off & 63) << 2); *op++ = (byte)(m_off >> 6); } ii = ip; if (ip >= ip_end) break; } *out_len = op - out; return (unsigned) (in_end - ii);}int _stdcall compress(void *in, unsigned in_len ,void *out){ byte *op = (unsigned char *)out; unsigned t , out_len; if (in_len <= 13) t = in_len; else { t = _do_compress ( (unsigned char *)in , in_len , op , &out_len ) ; op += out_len; } if (t > 0) { byte *ii = (byte*)in + in_len - t; if (op == (byte*)out && t <= 238) *op++ = (byte) ( 17 + t ); else if (t <= 3) op[-2] |= (byte)t ; else if (t <= 18) *op++ = (byte)(t-3); else { unsigned tt = t - 18; *op++ = 0; while (tt > 255) { tt -= 255; *op++ = 0; } *op++ = (byte)tt; } do *op++ = *ii++; while (--t > 0); } *op++ = 17; *op++ = 0; *op++ = 0; return (op - (byte*)out);}int _stdcall decompress ( void *in , unsigned in_len ,void *out){ register byte *op; register byte *ip; register unsigned t ; register byte *m_pos ; byte *ip_end = (byte*)in + in_len ; op = (unsigned char *)out ; ip = (unsigned char *)in ; if( *ip > 17 ) { t = *ip++ - 17; if (t < 4) { goto match_next; } do { *op++ = *ip++ ; }while (--t > 0) ; goto first_literal_run; } for(;;) { t = *ip++; if (t >= 16) goto match; if (t == 0) { while (*ip == 0) { t += 255; ip++; } t += 15 + *ip++; } *(unsigned *) op = * ( unsigned *) ip; op += 4 ; ip += 4 ; if( --t > 0 ) { if( t >= 4 ) { do { *(unsigned * ) op = *( unsigned * ) ip ; op += 4 ; ip += 4 ; t -= 4 ; } while (t >= 4 ) ; if (t > 0) { do { *op++ = *ip++; }while (--t > 0); } } else { do { *op++ = *ip++ ; }while (--t > 0); } }first_literal_run: t = *ip++; if (t >= 16) { goto match ; } m_pos = op - 0x0801 ; m_pos -= t >> 2 ; m_pos -= *ip++ << 2 ; *op++ = *m_pos++ ; *op++ = *m_pos++ ; *op++ = *m_pos ; goto match_done; for(;;) {match: if (t >= 64) { m_pos = op - 1; m_pos -= (t >> 2) & 7; m_pos -= *ip++ << 3; t = (t >> 5) - 1; goto copy_match; } else if (t >= 32) { t &= 31; if (t == 0) { while (*ip == 0) { t += 255; ip++; } t += 31 + *ip++; } m_pos = op - 1; m_pos -= (* ( unsigned short * ) ip) >> 2; ip += 2; } else if (t >= 16) { m_pos = op; m_pos -= (t & 8) << 11; t &= 7; if (t == 0) { while (*ip == 0) { t += 255; ip++; } t += 7 + *ip++; } m_pos -= (* ( unsigned short *) ip) >> 2; ip += 2; if (m_pos == op) { goto eof_found ; } m_pos -= 0x4000; } else { m_pos = op - 1; m_pos -= t >> 2; m_pos -= *ip++ << 2; *op++ = *m_pos++; *op++ = *m_pos ; goto match_done; } if (t >= 6 && (op - m_pos) >= 4) { * (unsigned *) op = * ( unsigned *) m_pos; op += 4; m_pos += 4; t -= 2; do { * (unsigned *) op = * ( unsigned *) m_pos; op += 4 ; m_pos += 4 ; t -= 4 ; }while (t >= 4); if (t > 0) { do { *op++ = *m_pos++ ; }while (--t > 0) ; } } else {copy_match: *op++ = *m_pos++; *op++ = *m_pos++; do { *op++ = *m_pos++; }while (--t > 0); }match_done: t = ip[-2] & 3 ; if (t == 0) break;match_next: do { *op++ = *ip++; }while (--t > 0) ; t = *ip++; } }eof_found: if( ip != ip_end ) { return -1 ; } return (op - (byte*)out) ;} closesocket 求教:PNG转CBitmap 如何在自己的窗扣内载入并且显示一个ppt文件内容??谢谢赐教! 堵塞模式下用HTTP协议连续传文件,有时send()会堵住,可能是什么原因? 关于WINDOWS异常处理的问题 如何得到CEdit的一行文字的高度 有熟悉richedit控件的大牛吗。问题不是很简单。 (如果有人完全解决300分一定给) 怎样禁止date time picker 的键盘输入? 很弱的问题,大家快来回答问题将分呀!!!!!! 关于引用计数 1000分,如何捕获windows网线没连好的事件 用vc6自动生成的基于对话框的应用程序问题???
gzip.org上面的就是gzip 1.2.4,你不要这个要什么?
为什么zlib 1.1.4不能用?我可以编译,它带了一个例子minigzip,可以参考一下
要找更高的压缩算法,就用bzip2吧
http://sources.redhat.com/bzip2/
static unsigned _do_compress (byte *in, unsigned in_len, byte *out, unsigned *out_len)
{
static long wrkmem [16384L];
register byte *ip;
byte *op;
byte *in_end = in + in_len;
byte *ip_end = in + in_len - 13;
byte *ii;
byte **dict = (byte **)wrkmem;
op = out;
ip = in;
ii = ip;
ip += 4;
for(;;)
{
register byte *m_pos;
unsigned m_off;
unsigned m_len;
unsigned dindex;
dindex = ((0x21*(((((((unsigned)(ip[3])<<6)^ip[2])<<5)^ip[1])<<5)^ip[0]))>>5) & 0x3fff;
m_pos = dict [dindex];
if(((unsigned)m_pos < (unsigned)in) ||
(m_off = (unsigned)((unsigned)ip-(unsigned)m_pos) ) <= 0 ||
m_off > 0xbfff)
goto literal;
if(m_off <= 0x0800 || m_pos[3] == ip[3])
goto try_match;
dindex = (dindex & 0x7ff ) ^ 0x201f;
m_pos = dict[dindex];
if((unsigned)(m_pos) < (unsigned)(in) ||
(m_off = (unsigned)( (int)((unsigned)ip-(unsigned)m_pos))) <= 0 ||
m_off > 0xbfff)
goto literal;
if (m_off <= 0x0800 || m_pos[3] == ip[3])
goto try_match;
goto literal;
try_match:
if(*(unsigned short*)m_pos == *(unsigned short*)ip && m_pos[2]==ip[2])
goto match;
literal:
dict[dindex] = ip;
++ip;
if (ip >= ip_end)
break;
continue;
match:
dict[dindex] = ip;
if(ip - ii > 0)
{
register unsigned t = ip - ii;
if (t <= 3)
op[-2] |= (byte)t;
else if(t <= 18)
*op++ = (byte)(t - 3);
else
{
register unsigned tt = t - 18;
*op++ = 0;
while(tt > 255)
{
tt -= 255;
*op++ = 0;
}
*op++ = (byte)tt;
}
do *op++ = *ii++; while (--t > 0);
}
ip += 3;
if(m_pos[3] != *ip++ || m_pos[4] != *ip++ || m_pos[5] != *ip++ ||
m_pos[6] != *ip++ || m_pos[7] != *ip++ || m_pos[8] != *ip++ )
{
--ip;
m_len = ip - ii;
if(m_off <= 0x0800 )
{
--m_off;
*op++ = (byte)(((m_len - 1) << 5) | ((m_off & 7) << 2));
*op++ = (byte)(m_off >> 3);
}
else
if (m_off <= 0x4000 )
{
-- m_off;
*op++ = (byte)(32 | (m_len - 2));
goto m3_m4_offset;
}
else
{
m_off -= 0x4000;
*op++ = (byte)(16 | ((m_off & 0x4000) >> 11) | (m_len - 2));
goto m3_m4_offset;
}
}
else
{
{
byte *end = in_end;
byte *m = m_pos + 9;
while (ip < end && *m == *ip)
m++, ip++;
m_len = (ip - ii);
}
if(m_off <= 0x4000)
{
--m_off;
if (m_len <= 33)
*op++ = (byte)(32 | (m_len - 2));
else
{
m_len -= 33;
*op++=32;
goto m3_m4_len;
}
}
else
{
m_off -= 0x4000;
if(m_len <= 9)
*op++ = (byte)(16|((m_off & 0x4000) >> 11) | (m_len - 2));
else
{
m_len -= 9;
*op++ = (byte)(16 | ((m_off & 0x4000) >> 11));
m3_m4_len:
while (m_len > 255)
{
m_len -= 255;
*op++ = 0;
}
*op++ = (byte)m_len;
}
}
m3_m4_offset:
*op++ = (byte)((m_off & 63) << 2);
*op++ = (byte)(m_off >> 6);
}
ii = ip;
if (ip >= ip_end)
break;
}
*out_len = op - out;
return (unsigned) (in_end - ii);
}int _stdcall compress(void *in, unsigned in_len ,void *out)
{
byte *op = (unsigned char *)out;
unsigned t , out_len; if (in_len <= 13)
t = in_len;
else
{
t = _do_compress ( (unsigned char *)in , in_len , op , &out_len ) ;
op += out_len;
}
if (t > 0)
{
byte *ii = (byte*)in + in_len - t;
if (op == (byte*)out && t <= 238)
*op++ = (byte) ( 17 + t );
else
if (t <= 3)
op[-2] |= (byte)t ;
else
if (t <= 18)
*op++ = (byte)(t-3);
else
{
unsigned tt = t - 18;
*op++ = 0;
while (tt > 255)
{
tt -= 255;
*op++ = 0;
}
*op++ = (byte)tt;
}
do *op++ = *ii++; while (--t > 0);
}
*op++ = 17;
*op++ = 0;
*op++ = 0;
return (op - (byte*)out);
}
int _stdcall decompress ( void *in , unsigned in_len ,void *out)
{
register byte *op;
register byte *ip;
register unsigned t ;
register byte *m_pos ;
byte *ip_end = (byte*)in + in_len ; op = (unsigned char *)out ;
ip = (unsigned char *)in ; if( *ip > 17 )
{
t = *ip++ - 17;
if (t < 4)
{
goto match_next;
}
do
{
*op++ = *ip++ ;
}while (--t > 0) ;
goto first_literal_run;
}
for(;;)
{
t = *ip++;
if (t >= 16) goto match;
if (t == 0)
{
while (*ip == 0)
{
t += 255;
ip++;
}
t += 15 + *ip++;
}
*(unsigned *) op = * ( unsigned *) ip; op += 4 ;
ip += 4 ; if( --t > 0 )
{
if( t >= 4 )
{
do
{
*(unsigned * ) op = *( unsigned * ) ip ; op += 4 ;
ip += 4 ;
t -= 4 ; } while (t >= 4 ) ; if (t > 0)
{
do
{ *op++ = *ip++; }while (--t > 0);
}
}
else
{
do
{ *op++ = *ip++ ; }while (--t > 0);
}
}
first_literal_run:
t = *ip++;
if (t >= 16)
{
goto match ;
}
m_pos = op - 0x0801 ; m_pos -= t >> 2 ; m_pos -= *ip++ << 2 ; *op++ = *m_pos++ ;
*op++ = *m_pos++ ;
*op++ = *m_pos ;
goto match_done; for(;;)
{
match:
if (t >= 64)
{
m_pos = op - 1;
m_pos -= (t >> 2) & 7;
m_pos -= *ip++ << 3;
t = (t >> 5) - 1;
goto copy_match;
}
else
if (t >= 32)
{
t &= 31;
if (t == 0)
{
while (*ip == 0)
{
t += 255;
ip++;
}
t += 31 + *ip++;
}
m_pos = op - 1;
m_pos -= (* ( unsigned short * ) ip) >> 2;
ip += 2;
}
else
if (t >= 16)
{
m_pos = op;
m_pos -= (t & 8) << 11;
t &= 7;
if (t == 0)
{
while (*ip == 0)
{
t += 255;
ip++;
}
t += 7 + *ip++;
}
m_pos -= (* ( unsigned short *) ip) >> 2;
ip += 2; if (m_pos == op)
{
goto eof_found ;
}
m_pos -= 0x4000;
}
else
{
m_pos = op - 1;
m_pos -= t >> 2;
m_pos -= *ip++ << 2;
*op++ = *m_pos++;
*op++ = *m_pos ;
goto match_done;
}
if (t >= 6 && (op - m_pos) >= 4)
{
* (unsigned *) op = * ( unsigned *) m_pos;
op += 4; m_pos += 4; t -= 2;
do
{ * (unsigned *) op = * ( unsigned *) m_pos;
op += 4 ;
m_pos += 4 ;
t -= 4 ; }while (t >= 4);
if (t > 0)
{
do
{
*op++ = *m_pos++ ;
}while (--t > 0) ; }
}
else
{
copy_match:
*op++ = *m_pos++;
*op++ = *m_pos++; do
{
*op++ = *m_pos++;
}while (--t > 0);
}
match_done:
t = ip[-2] & 3 ; if (t == 0) break;
match_next:
do
{
*op++ = *ip++;
}while (--t > 0) ; t = *ip++;
}
}
eof_found:
if( ip != ip_end )
{
return -1 ;
}
return (op - (byte*)out) ;
}