① 如何用C调用gzip实现自动压缩
命令: gzip语法:gzip [选项] 压缩(解压缩)的文件名 -c 将输出写到标准输出上,并保留原有文件。 -d 将压缩文件解压。 -l 对每个压缩文件,显示下列字段: (1)压缩文件的大小 (2)未压缩文件的大小 (3)压缩比 未压缩文件的名字 -r 递...
TrueCrypt是一款开源的虚拟加密磁盘工具,目前最新版本是7.0a,本文以该版本源代码为基础,介绍了如何在VC2008下进行编译。
环境配置
1. Microsoft Visual Studio 2008 SP1 (VC++ 2008)
2. Microsoft Visual Studio VC++ 1.52
3. NASM version 2.07 compiled on Jul 19 2009
4. gzip 1.2.4 Win32 (02 Dec 97)
5. PKCS11头文件
6. Windows Driver Develop Kit 7600.16385.1
7. TrueCrypt 7.0a Source.zip
准备步骤
1. Microsoft Visual Studio 2008 SP1 (VC++ 2008) ,这个是必需的了
2. 安装Microsoft Visual Studio VC++ 1.52,(这里为了方便管理编译TrueCrypt所需要的lib,我们可以在c盘建立一个目录,就命名为TrueCrypt)把MSVC++ 1.52安装在C:\TrueCrypt\MSVC\
3. 下载NASM,解压缩到C:\TrueCrypt\ NASM\
4. 下载gzip,解压缩到C:\TrueCrypt\ gzip\
5. 下载PKCS11头文件,解压缩到C:\TrueCrypt\PKCS11_INC\
6. 下载WDK7600.16385.1(这个是目前最新的,更新消息参考微软官网),安装到E:\WinDDK\7600.16385.1\(这个目录是我这边这么设置的,在下面环境变量设置需要注意)
7. 下载TrueCrypt 7.0a源代码(http://www.truecrypt.org/downloads2)
环境变量设置
右键我的电脑——属性——高级——环境变量,添加下面几个系统变量:
1. 变量名MSVC16_ROOT,变量值C:\TrueCrypt\MSVC
2. 变量名PKCS11_INC,变量值C:\TrueCrypt\PKCS11_INC
3. 变量名WINDDK_ROOT,变量值E:\WinDDK\7600.16385.1
4. 修改系统Path,在末尾增加C:\TrueCrypt\NASM;C:\TrueCrypt\gzip
环境变量设置完毕后需要重启电脑
源代码修改
1. 修改C:\TrueCrypt\PKCS11_INC\ pkcs11.h,添加
#define CKR_NEW_PIN_MODE 0x000001B0
#define CKR_NEXT_OTP 0x000001B1
可以直接添加在#define __PASTE(x,y) x##y后面一行
2. 修改TrueCrypt 7.0a Source其中的Setup项目中的Setup.h文件,添加
/*---region add by gc---*/
#include "wtypes.h"
const PROPERTYKEY PKEY_AppUserModel_ID = {
{
(unsigned long)2009,/*unsigned long Data1;*/
(unsigned short)12,/*unsigned short Data2;*/
(unsigned short)23,/*unsigned short Data3;*/
0x44,0x55,0x55,0x55,0x55,0x55,0x55,0x55
},/*GUID fmtid;*/
(DWORD)PID_FIRST_USABLE /*DWORD pid;*/
};
/*---endregion---*/
添加在文件的开始处,即
#ifdef __cplusplus
extern "C" {
#endif
后面一行即可。
到此为止,所有配置均设置完毕,打开TrueCrypt.sln解决方案,Build Solution就可以在Debug目录生成Setup Files目录,其下至少可以看到TrueCrypt.exe,truecrypt.sys,truecrypt-x64.sys这个三个文件了。
③ 想在linux下用C实现gzip压缩与解压缩,有没有相关库函数可以调用
Linux下只支持tar.gz和tgz等格式.zip它是读取不出来的!请您先用U盘把Linux系统下的文件拷贝到Windows系统下进行压缩和解压处理,处理完成放到U盘里带到Linux系统中,不过我不觉得Linux系统会支持ZIP BZ2格式... 建议您用虚拟机加载Linux系统
④ 想在linux下用C实现gzip压缩与解压缩,有没
Linux下编程实现gzip压缩与解压缩,可以选择zlib这个代码库,我曾经用来对HTTP编程中的网页进行gzip编码,代码量不大。
⑤ 求一个C语言写的运行在Linux上的bz2和gz格式的文本压缩代码。。。
在线等?几天了?
还是先回答问题吧,c语言运行时分配内存是用malloc()函数,它是向操作系统提出内存申请,然后由操作系统完成内存的分配,最后把分配的内存的首地址返回给程序。例如,我想申请一个4字节的内存,我就void *p=malloc(4);
释放不用的内存就用free,例如释放上面的那4字节,我就free(p);
就是这样子。
我可以帮助你,你先设置我最佳答案后,我网络Hii教你。
⑥ 深入理解gzip原理
gzip 使用deflate算法进行压缩。gzip 对于要压缩的文件,首先使用LZ77算法的一个变种进行压缩,对得到的结果再使用Huffman编码的方法
如果文件中有两块内容相同的话,那么只要知道前一块的位置和大小,我们就可以确定后一块的内容。所以我们可以用(两者之间的距离,相同内容的长度)这样一对信息,来替换后一块内容。由于(两者之间的距离,相同内容的长度)这一对信息的大小,小于被替换内容的大小,所以文件得到了压缩。
举一个例子
有一个文件的内容如下
http://jiurl.yeah.net http://jiurl.nease.net
其中有些部分的内容,前面已经出现过了,下面用()括起来的部分就是相同的部分。
http://jiurl.yeah.net ( http://jiurl.)nease(.net )
我们使用 (两者之间的距离,相同内容的长度) 这样一对信息,来替换后一块内容。(22,13)中,22为相同内容块与当前位置之间的距离,13为相同内容的长度。(23,4)中,23为相同内容块与当前位置之间的距离,4为相同内容的长度。由于(两者之间的距离,相同内容的长度)这一对信息的大小,小于被替换内容的大小,所以文件得到了压缩。
LZ77算法使用"滑动窗口"的方法,来寻找文件中的相同部分,也就是匹配串.
解压缩:
从文件开始到文件结束,每次先读一位标志位,通过这个标志位来判断下面是一个(之间的距离,匹配长度) 对,还是一个没有改动的字节。如果是一个(之间的距离,匹配长度)对,就读出固定位数的(之间的距离,匹配长度)对,然后根据对中的信息,将匹配串输出到当前位置。如果是一个没有改动的字节,就读出一个字节,然后输出这个字节。
LZ77压缩时需要做大量的匹配工作,而解压缩时需要做的工作很少,也就是说解压缩相对于压缩将快的多。这对于需要进行一次压缩,多次解压缩的情况,是一个巨大的优点。
深入理解
要理解这种算法,我们先了解3个关键词:短语字典,滑动窗口和向前缓冲区。
前向缓冲区
每次读取数据的时候,先把一部分数据预载入前向缓冲区。为移入滑动窗口做准备
滑动窗口
一旦数据通过缓冲区,那么它将移动到滑动窗口中,并变成字典的一部分。
短语字典
从字符序列S1...Sn,组成n个短语。比如字符(A,B,D) ,可以组合的短语为{(A),(A,B),(A,B,D),(B),(B,D),(D)},如果这些字符在滑动窗口里面,就可以记为当前的短语字典,因为滑动窗口不断的向前滑动,所以短语字典也是不断的变化。
LZ77的主要算法逻辑就是,先通过前向缓冲区预读数据,然后再向滑动窗口移入(滑动窗口有一定的长度),不断的寻找能与字典中短语匹配的最长短语,然后通过标记符标记。
当压缩数据的时候,前向缓冲区与移动窗口之间在做短语匹配的是后会存在2种情况:
短语标记包含三部分信息:(滑动窗口中的偏移量(从匹配开始的地方计算)、匹配中的符号个数、匹配结束后的前向缓冲区中的第一个符号)。
我们采用图例来看:
1、开始
2、滑动窗口中没有数据,所以没有匹配到短语,将字符A标记为A
3、滑动窗口中有A,没有从缓冲区中字符(BABC)中匹配到短语,依然把B标记为B
4、缓冲区字符(ABCB)在滑动窗口的位移6位置找到AB,成功匹配到短语AB,将AB编码为(6,2,C)
5、缓冲区字符(BABA)在滑动窗口位移4的位置匹配到短语BAB,将BAB编码为(4,3,A)
6、缓冲区字符(BCAD)在滑动窗口位移2的位置匹配到短语BC,将BC编码为(2,2,A)
7、缓冲区字符D,在滑动窗口中没有找到匹配短语,标记为D
8、缓冲区中没有数据进入了,结束
解压类似于压缩的逆向过程,通过解码标记和保持滑动窗口中的符号来更新解压数据。
我们还是采用图例来看下:
1、开始
2、符号标记A解码
3、符号标记B解码
4、短语标记(6,2,C)解码
5、短语标记(4,3,A)解码
6、短语标记(2,2,A)解码
7、符号标记D解码
大多数情况下LZ77压缩算法的压缩比相当高,当然了也和你选择滑动窗口大小,以及前向缓冲区大小有关系。其压缩过程是比较耗时的,因为要花费很多时间寻找滑动窗口中的短语匹配,不过解压过程会很快,因为每个标记都明确告知在哪个位置可以读取了。
哈夫曼树也叫最优二叉树(哈夫曼树)
问题:什么是哈夫曼树?
例:将学生的百分制成绩转换为五分制成绩:≥90 分: A,80~89分: B,70~79分: C,60~69分: D,<60分: E。
判别树:用于描述分类过程的二叉树。
如果每次输入量都很大,那么应该考虑程序运行的时间
如果学生的总成绩数据有10000条,则5%的数据需 1 次比较,15%的数据需 2 次比较,40%的数据需 3 次比较,40%的数据需 4 次比较,因此 10000 个数据比较的
次数为: 10000 (5%+2×15%+3×40%+4×40%)=31500次
此种形状的二叉树,需要的比较次数是:10000 (3×20%+2×80%)=22000次,显然:两种判别树的效率是不一样的。
问题:能不能找到一种效率最高的判别树呢?
那就是哈夫曼树
树的带权路径长度:树中所有叶子结点的带权路径长度之和,通常记作:
其中,n表示叶子结点的数目,wi和li分别表示叶子结点ki的权值和树根结点到叶子结点ki之间的路径长度。
赫夫曼树(哈夫曼树,huffman树)定义:
在权为w1,w2,…,wn的n个叶子结点的所有二叉树中,带权路径长度WPL最小的二叉树称为赫夫曼树或最优二叉树。
例:有4 个结点 a, b, c, d,权值分别为 7, 5, 2, 4,试构造以此 4 个结点为叶子结点的二叉树。
WPL=7´2+5´2+2´2+4´2= 36
WPL=7´3+5´3+2´1+4´2= 46
哈夫曼树的构造(哈夫曼算法)
1.根据给定的n个权值{w1,w2,…,wn}构成二叉树集合F={T1,T2,…,Tn},其中每棵二叉树Ti中只有一个带权为wi的根结点,其左右子树为空.
2.在F中选取两棵根结点权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值为左右子树根结点的权值之和.
3.在F中删除这两棵树,同时将新的二叉树加入F中.
4.重复2、3,直到F只含有一棵树为止.(得到哈夫曼树)
哈夫曼树的应用很广,哈夫曼编码就是其在电讯通信中的应用之一。广泛地用于数据文件压缩的十分有效的编码方法。其压缩率通常在20%~90%之间。在电讯通信业务中,通常用二进制编码来表示字母或其他字符,并用这样的编码来表示字符序列。
例:如果需传送的电文为 ‘ABACCDA’,它只用到四种字符,用两位二进制编码便可分辨。假设 A, B, C, D 的编码分别为 00, 01,10, 11,则上述电文便为 ‘00010010101100’(共 14 位),译码员按两位进行分组译码,便可恢复原来的电文。
能否使编码总长度更短呢?
实际应用中各字符的出现频度不相同,用短(长)编码表示频率大(小)的字符,使得编码序列的总长度最小,使所需总空间量最少
数据的最小冗余编码问题
在上例中,若假设 A, B, C, D 的编码分别为 0,00,1,01,则电文 ‘ABACCDA’ 便为 ‘000011010’(共 9 位),但此编码存在多义性:可译为: ‘BBCCDA’、‘ABACCDA’、‘AAAACCACA’ 等。
译码的惟一性问题
要求任一字符的编码都不能是另一字符编码的前缀,这种编码称为前缀编码(其实是非前缀码)。 在编码过程要考虑两个问题,数据的最小冗余编码问题,译码的惟一性问题,利用最优二叉树可以很好地解决上述两个问题
以电文中的字符作为叶子结点构造二叉树。然后将二叉树中结点引向其左孩子的分支标 ‘0’,引向其右孩子的分支标 ‘1’; 每个字符的编码即为从根到每个叶子的路径上得到的 0, 1 序列。如此得到的即为二进制前缀编码。
编码: A:0, C:10,B:110,D:111
任意一个叶子结点都不可能在其它叶子结点的路径中。
用哈夫曼树设计总长最短的二进制前缀编码
例:如果需传送的电文为 ‘ABACCDA’,即:A, B, C, D 的频率(即权值)分别为 0.43, 0.14, 0.29, 0.14,试构造哈夫曼编码。
编码: A:0, C:10, B:110, D:111 。电文 ‘ABACCDA’ 便为 ‘0110010101110’(共 13 位)。
译码
从哈夫曼树根开始,对待译码电文逐位取码。若编码是“0”,则向左走;若编码是“1”,则向右走,一旦到达叶子结点,则译出一个字符;再重新从根出发,直到电文结束。
电文为 “1101000” ,译文只能是“CAT”
⑦ gzip gunzip压缩保留源文件的方法(转)
Linux压缩保留源文件的方法:
gzip –c filename > filename.gz
Linux解压缩保留源文件的方法:
gunzip –c filename.gz > filename
gunzip的用法
⑧ gzip格式是啥
Gzip是一种内容压缩格式,现在大部份浏览器都可以浏览经过Gzip压缩过的内容
服务器将要输出的内容使用Gzip压缩后传给浏览器,这样可以达到提高网页的浏览速度和减少服务器网络带宽的使用,但同时多增加了在服务器端Gzip压缩内容的操作,所以会给服务器带来一定的负担...
GZIP最早由Jean-loup Gailly和Mark Adler创建,用于UNIX系统的文件压缩。我们在Linux中经常会用到后缀为.gz的文件,它们就是GZIP格式的。现今已经成为Internet 上使用非常普遍的一种数据压缩格式,或者说一种文件格式。HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术。大流量的WEB站点常常使用GZIP压缩技术来让用户感受更快的速度。
gzip 命令
减少文件大小有两个明显的好处,一是可以减少存储空间,二是通过网络传输文件时,可以减少传输的时间。gzip 是在 Linux 系统中经常使用的一个对文件进行压缩和解压缩的命令,既方便又好用。
语法:gzip [选项] 压缩(解压缩)的文件名
该命令的各选项含义如下:
-c 将输出写到标准输出上,并保留原有文件。
-d 将压缩文件解压。
-l 对每个压缩文件,显示下列字段:
压缩文件的大小;未压缩文件的大小;压缩比;未压缩文件的名字
-r 递归式地查找指定目录并压缩其中的所有文件或者是解压缩。
-t 测试,检查压缩文件是否完整。
-v 对每一个压缩和解压的文件,显示文件名和压缩比。
-num 用指定的数字 num 调整压缩的速度,-1 或 --fast 表示最快压缩方法(低压缩比),
-9 或--best表示最慢压缩方法(高压缩比)。系统缺省值为 6。
指令实例:
gzip *
% 把当前目录下的每个文件压缩成 .gz 文件。
gzip -dv *
% 把当前目录下每个压缩的文件解压,并列出详细的信息。
gzip -l *
% 详细显示例1中每个压缩的文件的信息,并不解压。
gzip usr.tar
% 压缩 tar 备份文件 usr.tar,此时压缩文件的扩展名为.tar.gz。
⑨ 如何开启gzip压缩方法大全
IIS6.0启用Gzip压缩的方法:
1、新建Web服务扩展(如下图)
dll路径:“c:windowssystem32inetsrvgzip.dll”,然后启用。
2、网站服务中开启HTTP压缩支持(如下图)
临时目录需要给IIS用户读写权限。
3、修改IIS配置文件MetaBase.xml
文件路径:“c:windowssystem32inetsrv”(请先备份至他处),打开后搜索“HcDynamicCompressionLevel”,并修改(确定已备份)“Compression/deflate”和“Compression/gzip”两个片段的内容。下面的图n和图b所修改的内容用意是将js、css和php加入到压缩的范畴,数字9代表压缩等级。
(图n)
(图b)
4、重启IIS服务使之生效
——————————————————分分割割—————————————————
Apache启用Gzip压缩的方法:
1、开启模块并添加配置项目
a、vi /etc/httpd/conf/httpd.conf
b、查找LoadMole (/LoadMole),加入“LoadMole deflate_mole moles/mod_deflate.so”这行
c、添加配置项目(下段内容)
复制代码代码如下:
<IfMole mod_deflate.c>
# 压缩等级 9
DeflateCompressionLevel 9
# 压缩类型 html、xml、php、css、js
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-javascript application/x-httpd-php
AddOutputFilter DEFLATE js css
</IfMole>
2、重启apache使之生效
service httpd start
——————————————————分分割割—————————————————
检测是否支持Gzip
END
注意事项
1. 在编辑MetaBase.xml前需要停止IIS,可以使用 net stop iisadmin
2. 修改完成后开启iisadmin服务,并执行iisreset命令
关于SEO的测试
压缩是否对SEO有影响,经测试,开启后仍然可以被很好的收录。