社区
VC.NET
帖子详情
有谁知道LZO这种压缩算法?想知道原理,有C或C++源码最好(100分求啊)
evawu999
2005-01-27 06:00:57
有谁知道LZO这种压缩算法?想知道原理,有C或C++源码最好。如果有其他更好的压缩算法也可,但希望也能提供原理和代码。evawu@grandi.cn
...全文
792
11
打赏
收藏
有谁知道LZO这种压缩算法?想知道原理,有C或C++源码最好(100分求啊)
有谁知道LZO这种压缩算法?想知道原理,有C或C++源码最好。如果有其他更好的压缩算法也可,但希望也能提供原理和代码。evawu@grandi.cn
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
11 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
nga96
2005-02-17
打赏
举报
回复
UP,学习中
evawu999
2005-02-16
打赏
举报
回复
谢谢大家的参与啊,等我看过以后马上结帖!!!
jhtchina
2005-02-03
打赏
举报
回复
你为什么不这样考虑的,直接执行WinRar 文件,然后用程序输入相应参数。
也能达到压缩的目的。
详见:http://www.cnblogs.com/jhtchina/articles/80335.html
http://www.cnblogs.com/jhtchina/articles/80185.html
zjd358
2005-02-02
打赏
举报
回复
http://datacompression.info/LZO.shtml
我也没有理论方面的资料,你找一些数据压缩方面的书,应该能有介绍!
zjd358
2005-02-01
打赏
举报
回复
// 代码是根据 Markus Franz Xaver Johannes Oberhumer 的 LZO 改写
// 而成, 所以算法上的问题请不要问我, 如果你对这个压缩算法有兴趣,
// 请拜访 LZO 的主页
// http://wildsau.idv.uni-linz.ac.at/mfx/lzo.html
// LZO 属于 GNU 软件, 在此声明, 本文件中的代码使用权利不同于风魂游
// 戏程序库中的其他部分, 请遵守 GNU 协议使用.
//#include <stdio.h>
//#include <string.h>
#include <stdlib.h>
#define byte unsigned char
int _stdcall compress(void *src, unsigned src_len, void *dst);
int _stdcall decompress(void *src, unsigned src_len, void *dst);
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 = out;
unsigned t,out_len;
if (in_len <= 13)
t = in_len;
else
{
t = _do_compress (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 = out;
ip = 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);
}
evawu999
2005-02-01
打赏
举报
回复
zjd358(泡泡) :你是否有原理呢?这个对我很重要,谢谢了!!!
liulxmooo
2005-01-30
打赏
举报
回复
up
evawu999
2005-01-28
打赏
举报
回复
大家广为参与啊,等待中……
心情解码
2005-01-28
打赏
举报
回复
:)
-
somedummy
2005-01-27
打赏
举报
回复
这个……
LZO好像在网络上面使用比较多,一般都是网络传输时候的实时压缩和解压,不了解
知识点滴 -
LZO
压缩算法
压缩算法
lzo
的正确c语言代码,
LZO
使用跟介绍
LZO
使用和介绍
LZO
说明摘要
LZO
是一个用 ANSI C 语言编写的无损压缩库。他能够提供非常快速的压缩和解压功能。解压并不需要内存的支持。即使使用非常大的压缩比例进行缓慢压缩出的数据,依然能够非常快速的解压。
LZO
遵循 GNU 的 GPL 使用许可。介绍
LZO
非常适合进行数据的实时压缩解压处理,这就是说他更关心操作速度,而不是压缩比例。
LZO
使用 ANSI C 语言编写,并且压缩后的...
hive
LZO
压缩
hive
LZO
压缩 本文环境介绍: 软件 版本 备注 centos 6.5 hadoop 2.7.1 2.7.*即可 hive 2.3.6
lzo
2.10 需要独立安装 1
lzo
压缩 1.1
lzo
的简介 1.1.1
lzo
定义
LZO
是致力于解压速度的一种数据
压缩算法
,相比于压缩比它更加追求速度,
LZO
是 Lempel-Ziv-Oberhumer 的...
LZO
数据算法 测试
老板忽然今天叫我把
LZO
的算法看下,看能不能移植,所以今天就开始记录下移植算法的过程。
想
说终于又给事情做了,对于一个应届毕业生,是很兴奋的事情。 <<<什么是
LZO
LZO
是致力于解压速度的一种数据
压缩算法
,
LZO
是 Lempel-Ziv-Oberhumer 的缩写。这个算法是无损算法,参考实现程序是线程安全的。实现它的一个自由软件工具是
lzo
p。最初的库是用 ANSI C ...
技术分享:hive
LZO
压缩
本文环境介绍: 软件版本备注centos6.5hadoop2.7.12.7.*即可hive2.3.6
lzo
2.10需要独立安装 1
lzo
压缩 1.1
lzo
的简介
LZO
是一个无损的数据压缩库,相比于压缩比它更加追求速度。 查阅官网地址:http://www.oberhumer.com/opensource/
lzo
http://www.
lzo
p.org 或缺更多有关
LZO
的信息 and 查阅压缩数据存储格式 获取有关Hive压缩数据存储信息。 hadoop下各种
压缩算法
的压缩比,.
VC.NET
7,540
社区成员
27,673
社区内容
发帖
与我相关
我的任务
VC.NET
.NET技术 VC.NET
复制链接
扫一扫
分享
社区描述
.NET技术 VC.NET
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章