① 如何用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有影響,經測試,開啟後仍然可以被很好的收錄。