玩仙剑奇侠传4剧情动画一过剧情动画就出来minilzo decompression failed:-8是

[转载]miniLZO无损压缩库评估
转自:http://blog.chinaunix.net/uid--id-3087276.html
一、应用场合
网络上传输大批量数据的时候,网络传输介质选择好之后网络的传输速度就是固定的了,(如100Mbit的以太网实际测量的传输速度大概在10MByte/
秒左右)而要想在固定的时间内传输更多的容量的数据,最常见的解决方案就是在传输之前通过一定的算法把数据的容量压缩小,然后通过网络传输,在对端接收到
数据之后,再通过相应的算法进行解压还原。
& & 压缩的时间 + 压缩后数据的传输时间 + 解压缩的时间
&未压缩数据的传输时间
就相当与提高了网络单位时间内的吞吐传输能力,拓宽了网络传输的带宽
二、miniLZO库使用介绍
LZO是一个开源的无损压缩C语言库,其优点是压缩和解压缩比较迅速占用内存小等特点(网络传输希望的是压缩和解压缩速度比较快,压缩率不用很高),其还有许多其他的优点详细参考其网站:,其提供了比较全的LZO库和一个miniLZO库,根据这个情况miniLZO完全满足我们的需求,其提供了1个C文件3个头文件,常用的有4个API在使用的时候包含minilzo.h即可:
85 /* compression */
&86 LZO_EXTERN(int)
&87 lzo1x_1_compress ( const
lzo_bytep src, lzo_uint
&88 lzo_bytep dst, lzo_uintp dst_len,
&89 lzo_voidp wrkmem );
decompression */
&92 LZO_EXTERN(int)
&93 lzo1x_decompress ( const
lzo_bytep src, lzo_uint
&94 lzo_bytep dst, lzo_uintp dst_len,
&95 lzo_voidp wrkmem /*
NOT USED */
&97 /* safe
decompression with overrun testing */
&98 LZO_EXTERN(int)
&99 lzo1x_decompress_safe ( const
lzo_bytep src, lzo_uint
100 lzo_bytep dst,
lzo_uintp dst_len,
101 lzo_voidp wrkmem /*
NOT USED */
miniLZO库使用也非常方便,在压缩和解压缩之前先调用lzo_init函数进行初始化,如果该函数返回LZO_E_OK就表明没有问题可以继续操作。需要压缩数据调用lzo1x_1_compress函数,需要解压数据就调用lzo1x_decompress函数或lzo1x_decompress_safe函数。这两个函数的区别是lzo1x_decompress_safe函数会对要解压缩数据的有效性进行验证,如果验证通过才会进行解压缩操作而lzo1x_decompress函数则不会这么做,如果数据不是有效的则会产生“段错误”。建议使用lzo1x_decompress_safe函数。一下是这些函数的详细操作说明:
lzo1x_1_compress函数进行压缩数据操作,其需要5个参数分别是:要压缩的数据、要压缩的数据的大小(单位为字节)、压缩后数据的缓冲区、压缩后缓冲区的大小(值结果参数,调用成功之后存储实际的压缩后的数据大小)、压缩工作缓冲区。压缩数据成功之后会返回LZO_E_OK;
lzo1x_decompress和lzo1x_decompress_safe函数进行数据的解压缩操作,其也需要5个参数分别是:要解压缩的数据、要解压缩数据的大小(单位为字节)、解压缩后数据的存放缓冲区、原始数据(未压缩数据)大小(值结果参数,执行成功之后返回解压缩后数据的实际大小)、解压缩不需要工作缓冲区可以为NULL。执行成功返回LZO_E_OK且其第4个参数要和原始数据大小一致。
lzo1x_1_compress
函数的第4个参数是值结果参数,传进去的值是用来指示存放压缩后数据的缓冲区大小,执行成功之后通过指针返回的结果是压缩后的数据实际使用的缓冲区大小,
即压缩后的数据大小。压缩后需要的数据的缓冲区的大小上限是可以根据未压缩数据大小进行计算的公式:output_block_size = input_block_size +
(input_block_size / 16) + 64 + 3;
lzo1x_1_compress函数的第5个参数是压缩的时候需要使用的工作缓冲区,缓冲的生成在miniLZO库的提供测试例程(testmini.c)中有相关的宏生成该缓冲区,而解压的时候就不需要缓冲区;
lzo1x_decompress_safe
解压的时候需要的第4个参数是值结果参数,传进去的值是原始的未压缩数据的大小,执行成功之后通过指针返回的是实际解压缩后的数据的大小。所以压缩之后的
数据在传输的时候需要将原始数据的大小和压缩后数据一起传输,否则对方在解压缩的时候将无法解压。可以定义一个数据结构专门用来传输,这些数据在传输的时
候相当于有效载荷:
& & unsigned long
& & & unsigned
char data[MAX_DATA_SIZE];
}COMP_DATA, *P_COMP_DATA;
三、压缩和解压缩时间的计算
在操作(压缩、解压缩)数据之前,获取当前的系统时间,进行相关操作。操作完成之后再次获取系统的时间,对2次获取的时间进行减操作即可得到实际操作所花费的时间。
可以通过gettimeofday函数获取当前的系统时间,在2次获取的时间之间进行相减操作即可得到操作所花费的时间,一下的例子是计算的操作所需花费时间的例程:
unsigned long interval_ms =
间隔的毫秒数 */
struct timeval stime,
gettimeofday(&stime, NULL);
/* TODO:Do
compression or decompression
gettimeofday(&etime, NULL);
interval_ms = (etime.tv_sec - stime.tv_sec) *
(etime.tv_usec - stime.tv_usec)/1000.0
四、测试压缩效果
测试的时候使用bmp和文本文件(代码打包之后)做测试,在X86的Linux虚拟机(单核256M内存,Debian 6.0
OS)上测试的效果比较理想一下是测试数据:
& & 原始大小 &
&压缩后大小 & & 压缩率
& & 压缩时间 &
& & &5292054
& &159395 &
& & &3.01%
& & &9.174ms
& &23.037ms
& & &6912056
& &33806 &0.489%
& & 8.33ms &
& & &6220856
& &5101891
& &&25.78ms
& &28.43ms
& & &6645760
& &2457890
&&34.68ms &
&6987402 & &
& 41.93% & &
102.86ms & 108.2ms
& &5684927
&31.13% & &
106.87ms & 113.86ms
测试了3个复杂程度不同的BMP文件和3个程序代码(lzo.tar是LZO
V2.06源代码,kdoc.tar是v2.6.34版本内核的Documentation文件夹打包后,kinc.tar是v2.6.34版本内核的include文件夹打包)结果是:
文本类型的数据在压缩速度和压缩比率上都比较稳定,解压时间和压缩时间相当;
BMP类型的数据的压缩时间和压缩比率和BMP图形的复杂程度相关,而且解压缩花费的时间普遍比压缩花费的时间长;
另外考虑压缩数据需要的内存缓冲区的大小大约为未压缩原始数据的2倍左右(压缩10M的数据需要20M左右的缓冲区,10M保存未压缩数据10M保存压缩后的数据),所以在大数据的时候要适当的考虑将大块的数据分割为小块进行压缩。
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
LZO和MiniLZO编码介绍
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口miniLZO压缩库使用注意事项 - dijkstar的专栏
- 博客频道 - CSDN.NET
1210人阅读
&使用miniLZO压缩库的好处不多说了。下面是一个在实际使用中需注意的地方:
解压缩函数(下面任何一个):
/* decompression */
LZO_EXTERN(int)
lzo1x_decompress
( const lzo_bytep src, lzo_uint
lzo_bytep dst, lzo_uintp dst_len,
lzo_voidp wrkmem /* NOT USED */ );
/* safe decompression with overrun testing */
LZO_EXTERN(int)
lzo1x_decompress_safe
( const lzo_bytep src, lzo_uint
lzo_bytep dst, lzo_uintp dst_len,
lzo_voidp wrkmem /* NOT USED */ );
中的第四个参数,即“解压缩后的”长度,虽然是一个指针型(要返回的内容),但却是需要输入“压缩前的长度值“,这一点一定注意!
实际上,在miniLZO压缩库给的testmini.c中已经看出来:
&* Step 4: decompress again, now going from 'out' to 'in'
& & new_len = in_//!!!!
& & r = lzo1x_decompress(out,out_len,in,&new_len,NULL);
& & if (r == LZO_E_OK && new_len == in_len)
& & & & printf(&decompressed %lu bytes back into %lu bytes\n&,
& & & & & & (unsigned long) out_len, (unsigned long) in_len);
& & & & /* this should NEVER happen */
& & & & printf(&internal error - decompression failed: %d\n&, r);
& & & & return 1;
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:362225次
积分:5748
积分:5748
排名:第1830名
原创:228篇
转载:25篇
评论:69条
(2)(6)(1)(6)(7)(1)(6)(2)(9)(2)(4)(1)(3)(4)(1)(2)(11)(8)(5)(18)(2)(1)(7)(1)(3)(9)(11)(8)(13)(5)(1)(8)(2)(5)(17)(4)(6)(1)(1)(5)(6)(2)(3)(1)(8)(5)(5)(2)(3)(12)(4)(1)

我要回帖

更多关于 仙剑奇侠传5剧情动画 的文章

 

随机推荐