① 如何用命令行實現壓縮
請參考
VFP中壓縮工具WinRAR的調用
-------------------------------------------
壓縮:
DELETE FILE bak.jhz
RUN /N7 WinRAR.exe a -ibck -r -k -o+ -y -hp123 -p123 bak.jhz dbf\*.*
或
RUN /N7 WinRAR.exe a -ibck -r -o+ -y -hp123 -p123 bak.jhz dbf\*.*
解壓:
RUN /N7 WinRAR.exe x -ibck -r -k -o+ -y -hp123 -p123 bak.jhz dbf\*.*
或
RUN /N7 WinRAR.exe x -ibck -r -o+ -y -hp123 -p123 bak.jhz dbf\*.*
參數說明:
a:添加到檔案文件中
x:從檔案文件中全路徑釋放文件
-ibck:後台運行WinRAR
-r:連同子文件夾操作
-k:鎖定檔案文件
-o+:覆蓋已經存在的文件
-y:對所有詢問均回應為「是」
-hp123:加密文件數據和文件頭,密碼為123
-p123:設置密碼為123,此密碼上一個密碼可以不一樣
bak.jhz:壓縮後的文件名或要解壓的文件(.jhz為自定義擴展名)
dbf\*.*:要壓縮的文件或要解壓到的文件位置
更詳細參數請參考:WinRAR中幫助文件
--------------------------------------------------
在實際應用中,如果Foxpro管理的資料庫,表文件較多,佔用空間較大,並且其長度又具有不確定性或不定增長性(如:明細帳),這樣,一個表的位元組數就可能超過一張軟盤的容量,而Foxpro的拷貝命令又不能支持自動分卷連續備份,因此,這就給資料庫的軟盤備份與恢復帶來一定的困難。如果能在Foxpro環境下,運用一種壓縮演算法,編寫一個高效實用的壓縮工具,那當然是最好的解決方案,遺憾的是筆者作過嘗試卻未獲成功,在此,筆者採取了調用基於DOS的壓縮工具軟體ARJ.exe,實現了壓縮分卷備份和分卷解壓縮恢復的功能,現將具體實現方法概述如下,以供探討。
一、定製ARJ運行環境
在Foxpro for Windows環境中,提供了運行外部命令或程序的命令:Run。如果Run中指定的程序沒有擴展名,Foxpro for Windows首先查找指定名稱的程序信息文件(後綴為PIF)。PIF允許在Windows下運行非Windows程序,並且可以指定其運行參數:程序是在窗口中運行還是全屏幕運行以及內存分配等。如果找到了相應的PIF,則使用其中指定的參數運行PIF中的程序;當找不到PIF時,就使用安裝在Foxpro for Windows目錄中的PIF文件FOXRUN.PIF。FOXRUN.PIF對程序在Windows中運行做了一些設置。因此,我們可以依據該文件,定製自己的PIF文件,不妨命名為:Arj_backup.pif。假設工作目錄為:C:\VfFP50\DATA,備分批處理文件為:d_backup.bat,恢復批處理文件為:d_restore.bat ,ARJ.EXE也已拷貝至該目錄下。
● file c:\vfp50\foxrun.pif to arj_backup.pif
● modi file d_backup.bat (使其包含以下語句)
cd c:\v fp50\data
arjva -va -a -y bak_data
exit(退出批處理操作)
●modi file d_restore.bat (使其包含以下語句)
cd c:\vfp50\data
arj x -va -a -y bak_data
exit
ARJ參數說明:
-va:使用A驅軟盤上所有自由空間執行壓縮任務。可以將a改為1440或1200,則以1.44M或1.22M大小分割備份文件。
-a:對所有屬性的文件都能進行處理,包括隱含文件。
-y:對所有程序提問,都默認按肯定回答,直接執行。
-x:解壓釋放壓縮文件。
Arj_backup.PIF 配置方法說明:
修改PIF配置的進入方法有兩種,一種方法是:當激活Arj_backup,出現運行窗口時,用滑鼠右鍵單擊窗口或屏幕底部對應任務欄,選擇屬性按鈕,進入配置頁面。另一種方法是:用「資源管理器」找到對應的PIF文件,單擊滑鼠右鍵,選擇屬性按鈕,進入配置頁面進行設置。由於配置內容較多,在此不能一一詳述,僅就運行本程序可能涉及的幾項參數做一介紹。
● 程序:
1.第一行為運行窗口標示,可設定為:正在進行數據文件壓縮……
2.命令行:Command.com(DOS命令處理程序,不需改動)
3.工作目錄:C:\vfp50\data(備份目錄)
4.批處理文件:D_backup.bat
5.快捷鍵:
6.運行:小窗口
7.高級屬性設置:選定「建議使用MS—DOS方式」復選框,此項配置的功能是:在運行此程序時,Windows檢測該程序是否要在MS-DOS方式下運行。如果是這樣,Windows將運行向導程序來安裝自定義圖標以便運行此程序。否則,如果程序需要在MS-DOS方式下運行,但是未復選此項,該程序可能無法正常運行。
8.更改圖標:可以為此運行窗口任意選定圖標。
9.選定「退出時關閉」復選框,此項配置的功能是:指定程序執行完後是否關團MS-DOS窗口。如果未復選 此框,MS-DOS窗口將保持打開狀態。
● 屏幕:
窗口:選定「在啟動時恢復設置」復選框,此項配置的功能是:退出此程序時保存窗口設置,包括窗口的大小、位置和字體。否則,運行窗口不能被任意托放,影響整體界面布局。
● 雜項:
滑鼠:「獨占方式」復選框,此項配置的功能是:單擊此處可以使該程序獨占滑鼠。在該程序運行期間,滑鼠指針被隱藏,滑鼠功能失效,退出後,滑鼠功能自動恢復正常。
與此類似,Arj_restore.PIF的配置方法亦可如法炮製,只需將「程序」中的「批處理文件」改為:D_restore.bat即可。
PIF運行窗口的位置、大小,可以手工托放、調整,如果想隱藏該窗口,可以將它縮至最小,再拖至屏幕右下角。
上述配置設定完成以後,按「確定」按鈕退出配置頁面。此時,ARJ運行環境定製完成。
二、Foxpro程序調用
1.提供軟盤備份、硬碟備份(備份到硬碟C:\backup目錄下)兩種方式。
2.軟盤備份前,先在硬碟調用ARJ壓縮分卷,並創建一個文本文件(date_backup)用於記錄備份時間、備份文件數量、所需軟盤數量,以便用戶據此判斷是否壓縮成功並進行軟盤備份;恢復時,也首先打開軟盤上的該文本,顯示備份時間、備份文件數量、所需軟盤數量,由用戶據此確定是否進行軟盤恢復。備份或恢復時,如果中途某張盤出現故障,或順序錯誤,均允許「重試?」。
3.軟盤恢復時,檢查每張盤的備份時間是否與上張盤一致,並檢查其裝入順序是否正確。確保備份數據的時效性、完整性。
4.軟盤恢復時,先在非工作目錄下進行,全部工作完成並確認無誤後,再移入工作目錄,這樣,可以避免資料庫的不完全覆蓋而造成的損壞。
5.出錯時激活故障處理常式err_proc,置出錯標志,退出處理。
---------------------------------------------------------------命令S為自釋放格式如:
RUN /N7 WinRAR.exe S -ibck -r -k -o+ -y bak.EXE dbf\*.*
② 如何用C語言編寫暴力破解壓縮文件解壓密碼的程序
由於有一個重要的Rar文件,極需解開,首先試用了ARPC,但是解壓的速度極慢,每秒只有30個左右,所以斷了窮舉破解的念頭,卻仍不死心,因為我從不崇尚窮舉破解的方法,除非每秒可以跑幾千萬次的,我或許可以一試,所以決定研究一下Winrar3.x密碼演算法,以期是否可以破解該密碼。查看了網路上的資料,包括看雪FAQ里的回答,都聲稱只能用窮舉法破解,起先並不理解,但通過研究,我理解了看雪前輩們在FAQ里所說的原因,不禁讓我佩服
Winrar加密思路的成熟。雖然研究的結果沒有什麼新意,但我還是決定把我的研究結果與大家一起分享,為那些仍然以為winrar密碼可以象破解注冊碼一樣的,通過修改winrar彈出框之類的更改文件流程指向可以達到跳過密碼檢驗的朋友,做一個簡要的說明。
一、Rar文件生成的流程。
Winrar加密文件時,總的分兩個步驟:
1:先把源文件壓縮,壓成一段數據段。
2:再將壓縮完的數據段加密。
對於同一個源文件來說,不進行加密,壓縮完,其rar文件中的數據段是一模一樣的。但是如果對同一個源文件來說,即使使用同一個密碼,加密完rar文件中的數據段是不一樣的,這是由於加密的密鑰是依賴於一個Salt(8個位元組的密鑰,用來加密時使用,存放在rar文件頭中里)
所以要解密rar加密文件關鍵在於數據解密這一步,那我們接下來研究一下如何加密的。
二、加密「壓縮完的數據段」的流程
1、獲取密鑰:
將明文的密碼與Salt一起,通過HASH演算法,生成兩個16位元組的密鑰。(一個是KEY(AES演算法的參數),一個是initVector)
2、以Key和initVector來加密壓縮數據:
這里,是一個循環加密的結構,每16位元組作為一個塊,進行加密(這可能正是為什麼加密完的文件長度總為16倍數的原因)。加密採用AES演算法(RAR採用的是AES的rijndael的標准應用)。這里注意:AES加密前,有一個異或運算,是先將每16位元組塊與上一個16位元組塊加密結果進行異或,然後再進行AES演算法的。我用一個簡單的示意代碼看說明:
;===============================================
packblock[0]=packblock[i]^initVector
encryptBlock[0]=AES(packblock[0]) ;(KEY為AES的密鑰)
for i=1to 塊數量-1
packblock[i]=packblock[i]^encryptBlock[i-1]
encryptBlock[i]=AES(packblock[i]);(KEY為AES的密鑰)
next
;packblock[i]表示壓縮完的每16位元組數據
;encryptBlock[i]表示加密完的每16位元組數據
;===============================================
三、解密的過程
由於AES演算法是對稱的,所以解密的過程,是加密過程的逆運算。但解密時AES演算法過程與加密所用的不一樣(是因為解密過程中由KEY生成的子密鑰表不一樣)。仍然需要我們將密碼輸入,與salt一起生成兩個16位元組密鑰,KEY和initVector。
;===============================================
packblock[0]=AES1(encryptBlock[0]) ;(KEY為AES的密鑰)
packblock[0]=packblock[i]^initVector
for i=1to 塊數量-1
packblock[i]=AES1(encryptBlock[i]) ;(KEY為AES的密鑰)
packblock[i]=packblock[i]^encryptBlock[i-1]
next
;===============================================
那判斷密碼是否正確的在什麼地方呢?
解密的過程是解密後的數據塊進行解壓縮,然後解成源文件,對該文件進行CRC校驗,存在RAR文件中的源文件CRC校驗碼比較,相同則密碼正確,不相同則密碼錯誤。
四、無法秒破的原因
從上面,我們了解了RAR文件的整體思路。地球人都知道,解密時,肯定有個步驟是來判斷密碼的正確與否。而且,依據以往的經驗,我們也許可以將某些判斷的點移動,那樣可以縮減破解的流程思路。那RAR的這一步在哪裡?它把校驗放在了最後的一步。如果要秒破,我們該怎麼做泥?至少我認為目前是不可能的。
我們從解密過程逆反過來看看:
1、CRC檢驗這一塊修改跳轉?根本毫無意義,因為它已經是最後一步了。你可以修改RAR文件頭的CRC值,你可以將它改得和你用任意密碼解壓出來的文件CRC值一樣,但你的文件根本就不是原來的文件了。可能已經完全面目全非了。所以,對這一過程不可行。CRC校驗本身是不可逆的
2、那麼把判斷提前到壓縮完的數據?
解壓的時候,有沒有什麼來判斷壓縮數據是否正確?壓縮完的數據,有沒有固定的特徵,是否可以做為解壓的判斷,在這一步里,我們也無法找到有效的可用的固定特徵。因為這一步涉及到RAR的壓縮演算法。即使一個源文件,即使你的文件前一部分是完全相同的,只對後面的部分進行改過,那麼壓縮完,數據也是完全一樣的。因為壓縮完的數據首先是一個壓縮表,後面是編碼。文件不一樣,掃描完的壓縮表也不一樣,編碼又是依賴於壓縮表,所以,這里頭找不到壓縮完的數據有任何的固定特徵可以用來判斷的。
不管壓縮數據是什麼樣的,Winrar都一如既往地進行解壓,沒有進行壓縮數據是否有效的判斷。
3、那假如我們破解了AES了泥?
由於AES只依賴於KEY,如果AES演算法被破解了,我們知道了KEY,我們可以解出壓縮完的數據,但是這里有一個問題,還有一個initVector密鑰,用來第一個16位元組塊的異或,你沒有initVector參數,你第一個16位元組塊的數據便無法解得出來。
4、那就只能從第一步Hash的演算法入手
即使你能破解hash,但hash後的結果泥?沒有結果,你怎麼返推密碼。
所以綜上,我發現rar的加密是由hash和AES兩種演算法互相牽制,而兩種演算法當前都無法破解,至少目前還沒有辦法秒破,也理解了看雪高手講的道理。
五、對窮舉提高演算法效率的一些設想。
我用匯編寫完了RAR窮舉解密的演算法模塊,但是如何提高效率,優化窮舉的速度泥?我有如下的想法:
1、從壓縮數據里找尋特徵,省掉解壓縮、CRC檢驗代碼和生成initVector生成代碼。目前,通過多次實驗,我找到的一個特徵(不知道這個是否正確),即解密完的最後一個16位元組塊的最後一個位元組必須為0。因為經過多次的試驗,我發現有加密的數據段長度都會比未加密前的數據長,那麼,最後一個
16個位元組的數據塊解密完,多出的部分就都為0,但多出幾個位元組泥?多次實驗,長度不一,我試想著從加密數據段最後一個16個位元組塊著手,只解這一塊,看是否一個位元組為0,這樣,只解密16個位元組的數據,來大大提高效率?如果能進行到這一步了,再通過解全部數據,進行CRC校驗的判斷。
2、如果第一個特徵不成立的話,針對特定格式的壓縮文件,比如doc、jpg等,部分數據固定,壓縮完的數據是否存在相互牽制的數據?從而把判斷提前,這一步,我不知道如何找到壓縮完的數據是否存在相互牽制的數據。
③ sqlserver如何壓縮數據文件空間
在程序組中,展開「Sqlserver」運行「查詢分析器」。輸入用戶名、密碼。
④ 用C語言編程:一個簡單的數據壓縮程序(急!!!)
#include"stdio.h"
int c1(char a[],int i)
{int c=1;
while(a[i+1]==a[i])
{c++;i++;}
return c;
}
int c2(char a[],int i)
{int c=0;
while(a[i+1]!=a[i])
{c++;i++;}
return c;
}
int len(char a[])
{ int i=0;
while(a[i]!='\0')
i++;
return i;
}
main()
{char b[100];
char a[100]={'5','5','5','8','1','3','9','9','9','9','7','2','7','2','6','6','6'};
int i=0,j=0,k=0,s,c;
while(a[i]!='\0')
{
if(a[i+1]==a[i])
{
c=c1(a,i);
b[j]=c;
b[j+1]=a[i];
i++;j++;
}
else
{ c=c2(a,i);
b[j]=-c;
for(k=0;k<c;k++)
{b[j+1]=a[i];
i++;j++;}
}
i+=c;
}
s=len(b);
for(j=0;j<s;j++)
printf("%d",b[j]);
}
幫我看一下,哪裡錯了,謝謝
⑤ 壓縮加密流程
壓縮是一種通過特定的演算法來減小計算機文件大小的機制。這種機制是一種很方便的發明,尤其是對網路用戶,因為它可以減小文件的位元組總數,使文件能夠通過較慢的互聯網連接實現更快傳輸,此外還可以減少文件的磁碟佔用空間。
中文名
壓縮
外文名
compression
類別
計算機技術
目的
節省保存空間和傳輸時間
按文件分類
圖片壓縮、文本壓縮
快速
導航
原理重復壓縮軟體和格式文件壓縮機制圖像壓縮技術
基本介紹
壓縮(compression)是為了減少數據大小以節省保存空間和傳輸的時間。為了數據的傳輸,壓縮能夠作用於單獨的數據內容或者所有的傳輸單元(包括數據頭),這取決於一些特定的因素。
內容壓縮很簡單,它就是移除多餘的空白字元,插入單個的重復字元指出一個字元串中重復的字元,以及將小型的位串用頻繁使用的字元替代。這種類型的壓縮能夠將文本文件的大小減少50%。壓縮由使用特定公式和演算法的程序來執行,它確定如何壓縮和解壓數據。[1]
原理
利用演算法將文件有損或無損地處理,以達到保留最多文件信息,而令文件體積變小。壓縮文件的基本原理是查找文件內的重復位元組,並建立一個相同位元組的"詞典"文件,並用一個代碼表示,比如在文件里有幾處有一個相同的詞"中華人民共和國"用一個代碼表示並寫入"詞典"文件,這樣就可以達到縮小文件的目的軟體。由於計算機處理的信息是以二進制數的形式表示的,因此壓縮軟體就是把二進制信息中相同的字元串以特殊字元標記來達到壓縮的目的。為了有助
⑥ 如何用程序實現Access資料庫的壓縮,vc+ado實現
ADO壓縮access資料庫:
1.頭文件加一行:
#import "C:\PROGRAM FILES\COMMON FILES\System\ado\MSJRO.DLL" no_namespace
2.代碼:
...
try
{
IJetEnginePtr jet(__uuidof(JetEngine));
jet->CompactDatabase(
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\\nwind2.mdb",
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\\abbc.mdb;" \
"Jet OLEDB:Engine Type=4");
}
catch(_com_error &e)
{
::MessageBox(NULL, (LPCTSTR)e.Description( ), "", MB_OK) ;
}
具體 看 http://topic.csdn.net/t/20030521/14/1814041.html
⑦ 如何用C++程序編寫數據壓縮系統
bmp轉成jpg也是壓縮哦!
/**********************bmp點陣圖轉jpeg begin*************************
begin
abitmap := tbitmap.Create;
od1.Filter := '點陣圖文件|*.bmp';
if od1.Execute then
filename := od1.filename
else
Exit;
bsSkinGroupBox1.Caption := filename;
abitmap.LoadFromFile(filename);
Image1.Picture.Assign(abitmap);
ajpg := tjpegimage.Create;
ajpg.Assign(abitmap);
ajpg.CompressionQuality := 75;
ajpg.Compress;
Sd1.Filter := 'jpg文件|*.jpg';
if Sd1.Execute then
ajpg.SaveToFile(Sd1.filename + '.jpg');
ajpg.Free;
abitmap.Free;
end;
//**********************bmp點陣圖轉jpeg end*************************
另外,站長團上有產品團購,便宜有保證
⑧ c語言編寫文件壓縮程序的設計思路 急啊
這個,我覺得應該找一個成熟的庫,看需求了,比如Huffman演算法的,或者直接開源的zlib之類的,然後你的c調用庫的API介面,就可以了。其實你的c代碼只是對庫的功能的一個簡單封裝,最多提供一些帶壓縮的文件從哪裡來,要放到哪裡去這些。數據壓縮是一個很大的課題,看你的需求了。
⑨ java編程:數據壓縮規則
你是不是問如何編寫一個程序來壓縮數據?如果你是想解決這個問題的話,繼續往下看,如果你只是想要應付考試的話就算了。
—— 分割線
JDK本身提供了數據壓縮的一個API
java.util.zip.Deflater.deflateBytes(byte[] b, int off, int len)
以下是我使用的一個例子,有點多,注釋看不懂可以問我,不知道怎麼用可以問我,其他的就算了。
/**
* threshold value for compress
*/
public static final int THRESHOLD = 1200;
/**
* Answer a byte array compressed in the DEFLATER format from bytes.
*
* @param bytes
* a byte array
* @return byte[] compressed bytes
* @throws IOException
*/
public static byte[] compress(byte[] bytes)
{
// Create the compressor with highest level of compression
Deflater compressor = new Deflater();
compressor.setLevel(Deflater.BEST_COMPRESSION);
// Give the compressor the data to compress
compressor.setInput(bytes);
compressor.finish();
// Create an expandable byte array to hold the compressed data.
// You cannot use an array that's the same size as the orginal because
// there is no guarantee that the compressed data will be smaller than
// the uncompressed data.
ByteArrayOutputStream bos = new ByteArrayOutputStream(bytes.length);
// Compress the data
byte[] buf = new byte[1024];
while (!compressor.finished())
{
int count = compressor.deflate(buf);
bos.write(buf, 0, count);
}
try
{
bos.close();
}
catch (IOException e)
{
}
// Get the compressed data
byte[] compressedData = bos.toByteArray();
return compressedData;
}
/**
* Answer a byte array that has been decompressed from the DEFLATER format.
*
* @param bytes
* a byte array
* @return byte[] compressed bytes
* @throws IOException
*/
public static byte[] uncompress(byte[] bytes)
{
// Create the decompressor and give it the data to compress
Inflater decompressor = new Inflater();
decompressor.setInput(bytes);
// Create an expandable byte array to hold the decompressed data
ByteArrayOutputStream bos = new ByteArrayOutputStream(bytes.length);
// Decompress the data
byte[] buf = new byte[1024];
while (!decompressor.finished())
{
try
{
int count = decompressor.inflate(buf);
bos.write(buf, 0, count);
}
catch (DataFormatException e)
{
}
}
try
{
bos.close();
}
catch (IOException e)
{
}
// Get the decompressed data
byte[] decompressedData = bos.toByteArray();
return decompressedData;
}
⑩ 用C語言設計 簡單的數據壓縮與解壓縮程序
把所有的數據先讀出來,存到數組中,然後遍歷:
假設已搜到前i個不同的,且第i+1個與第i個不同,已將前i個存入臨時數組,i>=1。如果第i+1和第i+2個不同,則第i+1個一並按序存入臨時數組。如果第i+1個和第i+2個相同,則前i個做一次壓縮處理,清空臨時數組。
找連續相同的有多少個容易得多,就不具體說明了
我可以幫助你,你先設置我最佳答案後,我網路Hii教你。