久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

使用 XZ Utils 獲得更高的壓縮率

 dwlinux_gs 2014-12-12

在 IBM Bluemix 云平臺(tái)上開發(fā)并部署您的下一個(gè)應(yīng)用,。

現(xiàn)在就開始免費(fèi)試用

關(guān)于 XZ Utils

XZ Utils 是為 POSIX 平臺(tái)開發(fā)具有高壓縮率的工具,。它使用 LZMA2 壓縮算法,,生成的壓縮文件比 POSIX 平臺(tái)傳統(tǒng)使用的 gzip,、bzip2 生成的壓縮文件更小,,而且解壓縮速度也很快。最初 XZ Utils 的是基于 LZMA-SDK 開發(fā),,但是 LZMA-SDK 包含了一些 WINDOWS 平臺(tái)的特性,,所以 XZ Utils 為以適應(yīng) POSIX 平臺(tái)作了大幅的修改。XZ Utils 的出現(xiàn)也是為了取代 POSIX 系統(tǒng)中舊的 LZMA Utils,。

XZ Utils 主要包含了下列部分:

  1. 命令行程序 xz,,用來(lái)生成和解壓縮 .xz 壓縮文件。

  2. 一組實(shí)用的腳本工具 (xzcat, xdiff, xzgrep 等)提供瀏覽,,查找以及比較 .xz 文件內(nèi)容等功能,。

  3. liblzma 壓縮庫(kù),提供算法的實(shí)現(xiàn)和近似于 ZLIB 的編程接口,。

  4. 提供對(duì) LZMA Utils 的一些兼容

xz 文件格式

XZ Utils 工具生成的壓縮文件擴(kuò)展名為 .xz (MIME 類型為"application/x-xz"),。.xz 文件格式具有下列特點(diǎn):

基于數(shù)據(jù)流: 易于通過(guò)管道 (pipe) 生成壓縮文件或解壓縮文件。.xz 文件格式與 .gz/.bz2 文件一樣,,不具備對(duì)多個(gè)文件進(jìn)行歸檔打包的能力,。若要處理多個(gè)文件,可以和歸檔工具 tar 結(jié)合使用,,生成擴(kuò)展名為 .tar.xz 或 .txz 的壓縮文件,。

隨機(jī)讀取: 存儲(chǔ)的數(shù)據(jù)被劃分為獨(dú)立的壓縮塊,并對(duì)每個(gè)壓縮塊進(jìn)行索引,,當(dāng)每個(gè)壓縮塊比較小時(shí),,便能夠進(jìn)行有限的隨機(jī)讀取壓縮數(shù)據(jù)。

完整性驗(yàn)證: 可以使用 CRC32,、CRC64,、SHA-256 來(lái)進(jìn)行數(shù)據(jù)的完整性驗(yàn)證,也可以增加自定義驗(yàn)證方法,。

可連接(concatenation): 類似于 .gz/.bz2 文件,,可以把多個(gè)壓縮數(shù)據(jù)流連接到一個(gè)文件中。解壓縮時(shí),,就像解壓一個(gè)正常單壓縮流文件一樣,。

支持多filterfilter: 提供自定義 filter 的能力,也能夠?qū)⒍鄠€(gè) filter 組成 filter 鏈,,對(duì)數(shù)據(jù)進(jìn)行處理,。這點(diǎn)與 Unix 命令間使用的管道 (pipe) 類似。

可填充(padding): 可以在 .xz 文件末尾填充二進(jìn)制'0'以充滿特定大小的空間,,比如備份磁帶上的一個(gè)塊 (block),。

LZMA2 壓縮算法

LZMA2 是 .xz 文件格式使用的壓縮算算法。LZMA(Lempel-Ziv-Markov chain-Algorithm) 原本是 Windows 平臺(tái)上著名壓縮工具 7-Zip 中的 .7z 文件格式的默認(rèn)壓縮算法,。LZMA 使用類似于 LZ77 的字典編碼機(jī)制,。在大多數(shù)情況下,,LZMA 算法都能夠提供很高壓縮率和較快的壓縮速度。LZMA2 是 LZMA 的改進(jìn)版本,,相對(duì)于 LZMA,,LZMA2 增進(jìn)了 encoder 和 decoder 的實(shí)現(xiàn),并改善了對(duì)多線程的支持,。

高壓縮率

與 POSIX 系統(tǒng)上傳統(tǒng)的壓縮工具 gzip,、bzip2 相比,XZ Utils 吸引人的地方在于,,它能夠提供更高的壓縮率,,生成的文件更小,而且解壓數(shù)據(jù)的速度也很快,。XZ Utils 的主頁(yè)上描述:對(duì)于典型文件,,XZ Utils 能夠生成比使用 gzip 小 30%,,比使用 bzip 小 15% 的壓縮文件,。

下面便針對(duì)壓縮率、壓縮速度和解壓速度三個(gè)方面進(jìn)行簡(jiǎn)單的驗(yàn)證,。

測(cè)試環(huán)境的 CPU 為 AMD Athlon X4 3.0GHz,,內(nèi)存為 8G。操作系統(tǒng)為 64 位版本的 Gentoo Linux,。所有的測(cè)試均在 /dev/shm(即內(nèi)存設(shè)備)下進(jìn)行,,這樣盡可能避免了 I/O 讀寫對(duì)測(cè)試結(jié)果的影響。

測(cè)試內(nèi)容為 gzip,、bzip2,、xz 分別壓縮原始大小為 445M 的 linux-kernel-3.2.1.tar 文件,然后解壓縮生成的壓縮文件,。測(cè)試分兩組:

  1. gzip,、bzip2 和 xz 分別使用參數(shù)"-1"(最小壓縮率)至"-9"(最大壓縮率)壓縮文件。

  2. 不設(shè)定壓縮率參數(shù)既使用各自的默認(rèn)壓縮率,。gzip 和 xz 默認(rèn)壓縮率參數(shù)均為"-6",bzip2 默認(rèn)相應(yīng)的為"-9",。

分別記錄下生成的壓縮文件大小,壓縮用時(shí),,解壓用時(shí)數(shù)據(jù),。將所有收集到的數(shù)據(jù)進(jìn)行整理。

處理后,,使用 gnuplot 工具分別生成了下面的三個(gè)柱狀比較圖,。下列柱狀圖中 X 軸的 "-" 表示使用默認(rèn)壓縮率。

壓縮后文件大小的比較如下圖:

圖 1. 壓縮后文件大小比較
圖 1. 壓縮后文件大小比較

根據(jù)上圖,,清楚地顯示 xz 生成的壓縮文件最小,,即具有高壓縮率,。且通過(guò)圖中比較可以看出,xz 生成的壓縮文件大小的確約比 gzip 生成的文件小 30%,,比 bzip 生成的文件小 15%,。

壓縮用時(shí)的比較如下圖:

圖 2. 壓縮用時(shí)數(shù)據(jù)比較:
圖 2. 壓縮用時(shí)數(shù)據(jù)比較:

由此圖可以看到 xz 隨著壓縮率的升高,所用壓縮時(shí)間也會(huì)隨之增長(zhǎng),。且相對(duì)于 gzip/bzip2 所用時(shí)間大幅增加,。在對(duì)壓縮時(shí)間要求相對(duì)苛刻的場(chǎng)合,并不推薦使用 XZ Utils,。

解壓縮用時(shí)的比較如下圖:

圖 3. 解壓縮用時(shí)數(shù)據(jù)比較:
圖 3. 解壓縮用時(shí)數(shù)據(jù)比較:

由此圖可以看到 xz 的解壓速度和 gzip 一樣有著穩(wěn)定的表現(xiàn),。大幅少于 bzip2 的解壓縮用時(shí),雖比 gzip 用時(shí)稍多,,但從 xz Utils 在同等條件下比 gzip 擁有更出色高壓縮率來(lái)看,,解壓縮用時(shí)的表現(xiàn)也是不錯(cuò)的。

從以上的驗(yàn)證數(shù)據(jù)的對(duì)比可以看出:XZ Utils 具有 高壓縮率,解壓速度快的特點(diǎn),。能夠生成更小文件的同時(shí),,也能提供穩(wěn)定快速的解壓,在對(duì) 數(shù)據(jù)大小比較敏感的場(chǎng)合,,比如說(shuō)大數(shù)據(jù)的網(wǎng)絡(luò)傳輸,,文件的備份,處理能力有限的嵌入系統(tǒng)等場(chǎng)合,,有著十分廣泛的用途,。

回頁(yè)首

使用 xz 命令

xz 命令的基本用法

  1. xz 命令幫助信息

    $ xz --help 
     Usage: xz [OPTION]... [FILE]... 
     Compress or decompress FILEs in the .xz format. 
    
      -z, --compress      force compression 
      -d, --decompress    force decompression 
      -t, --test          test compressed file integrity 
      -l, --list          list information about .xz files 
      -k, --keep          keep (don't delete) input files 
      -f, --force         force overwrite of output file and (de)compress links 
      -c, --stdout        write to standard output and don't delete input files 
      -0 ... -9           compression preset; default is 6; take compressor *and* 
                          decompressor memory usage into account before using 7-9! 
      -e, --extreme       try to improve compression ratio by using more CPU time; 
                          does not affect decompressor memory requirements 
      ...
  2. 壓縮一個(gè)文件 test.txt,壓縮成功后生成 test.txt.xz, 原文件會(huì)被刪除,。

    $ xz test.txt 
     $ ls test.txt* 
     test.txt.xz
  3. 解壓 test.txt.xz 文件,,并使用參數(shù) -k 保持原文件不被刪除,

    $ xz -d -k test.txt.xz 
     $ ls test.txt* 
     test.txt.xz test.txt
  4. 使用參數(shù) -l 顯示 .xz 文件的基本信息,?;拘畔▔嚎s率、數(shù)據(jù)完整性驗(yàn)證方式等,。也可以和參數(shù) -v 或 -vv 配合顯示更詳盡的信息,。

    $ xz -l index.txt.xz 
     Strms  Blocks   Compressed Uncompressed  Ratio  Check   Filename 
        1       1        768 B      1,240 B  0.619  CRC64   index.txt.xz
  5. 使用參數(shù) -0, -1, -2, … -6, … -9 或參數(shù) --fast, --best 設(shè)定壓縮率。xz 命令的默認(rèn)為 -6 ,,對(duì)于大多數(shù)系統(tǒng)來(lái)說(shuō),,甚至是一些較舊的系統(tǒng),-4 … -6 壓縮率預(yù)設(shè)值都不錯(cuò)的表現(xiàn),。

    $ xz -k7 xz_pipe_decomp_mini.c 
     $ xz -k --fast xz_pipe_decomp_mini.c
  6. 和 tar 命令配合處理多個(gè)文件,。一般來(lái)說(shuō),有兩種簡(jiǎn)單的方法將 tar 和 xz 結(jié)合起來(lái),,一是使用管道,,或是使用 tar 命令的參數(shù)'J',。兩種方法各自有各自的優(yōu)點(diǎn),第一種方法可以充分利用 xz 利用豐富的參數(shù),。而第二種方法使用起來(lái)更簡(jiǎn)單容易,。例子分別如下

    • 使用管道

      $  tar cf -  *.c  | xz --best > src.tar.xz   # compress 
       $  xz -d src.tar.xz --stdout | tar -x        # decompress
    • 使用 tar 參數(shù) "J

      $  tar cJf src.txz  *.c                      # compress 
       $  tar xJf src.txz                           # decompress


      "

復(fù)雜的用法

  1. 使用參數(shù) -H 顯示 xz 命令所有 options. 參數(shù) -H 比使用參數(shù) --help 顯示的內(nèi)容更詳細(xì)。

    $ xz -H  | more
  2. 借助 xargs 命令并行壓縮多文件,。下面的命令行可以將 /var/log 目錄下所有的擴(kuò)展名為 .log 的文件壓縮,。通過(guò) xargs 命令同時(shí)運(yùn)行多個(gè) xz 進(jìn)行壓縮。

    # find /var/log -type f -iname "*.log" -print0 | xargs -P4 -n16 xz -T1

    注意:運(yùn)行此命令須有 root 權(quán)限,。

  3. 連接 (concatenation) 多個(gè) .xz 文件,。可以把多個(gè)壓縮數(shù)據(jù)流連接 (concatenation) 到一個(gè)文件中,。解壓縮時(shí),,就像解壓一個(gè)正常單壓縮流文件一樣。如下例,,兩個(gè) .xz 文件 concat_1.txt.xz 和 concat_2.txt.xz, 用 cat 命令將他們合并為文件 concat.xz,,解壓縮 concat.xz 這個(gè)文件會(huì)發(fā)現(xiàn) concat_1.txt.xz 和 concat_2.txt.xz 中的內(nèi)容合并在一起了。

    $ xzcat concat_1.txt.xz 
     .xz file concatenation test: ~ file1 ~ 
     $ xzcat concat_2.txt.xz 
     .xz file concatenation test: ~ file2 ~ 
     $ cat concat_1.txt.xz concat_2.txt.xz > concat.txt.xz  #concatenation 
     $ xz -d concat.txt.xz                   #decompress 
     $ cat concat.txt                         #print file concat.txt 
     .xz file concatenation test: ~ file1 ~ 
     .xz file concatenation test: ~ file2 ~
  4. 適于 shell 編程的 Robot 模式,。xz 命令使用參數(shù) --robot 輸出易于 shell 處理的信息,。

    $ xz --list xz_pipe_mini.exe.xz            ## normal output 
     Strms  Blocks   Compressed Uncompressed  Ratio  Check   Filename 
        2       2     12.8 KiB     42.7 KiB  0.300  CRC64   xz_pipe_mini.exe.xz 
     $ xz --list --robot  xz_pipe_mini.exe.xz   ## robot model 
     name    xz_pipe_mini.exe.xz 
     file    2       2       13112   43695   0.300   CRC64   0 
     totals  2       2       13112   43695   0.300   CRC64   0       1

    下例是利用 --robot 打印出文件壓縮率的一個(gè)例子:

    $ xz -l --robot xz_pipe_mini.exe.xz | gawk \ 
            '/^name/ {printf "%s =>",$2} \ 
             /^totals/ {printf "compressed radio:%.2f%\n", $6 * 100}'
     xz_pipe_mini.exe.xz =>compressed radio:30.00%
  5. 自定義 filter Chain. 有時(shí)需要一些特殊的設(shè)定,,以滿足一些特定需求,。xz 提供了很多 參數(shù)自定義壓縮細(xì)節(jié)。下面有兩個(gè)例子

    • 若希望解壓縮使用很少內(nèi)存,,比如在嵌入式系統(tǒng)中解壓,。可以使用使用參數(shù) -e,,并設(shè)定壓縮使用的字典大小為 64KB,。參數(shù) -e (--extreme) 是指使用稍慢的壓縮速度以嘗試稍稍提高一些壓縮率。這樣便可在解壓縮時(shí)使用很少的內(nèi)存空間,。命令如下:

      $ xz --check=crc32 --lzma2=preset=6e,dict=64KiB file

    • 若壓縮文件中是可執(zhí)行的二進(jìn)制數(shù)據(jù)時(shí),,使用的合適的 BCJ(branch/call/jump) filter 可以提高壓縮率。例如 libwx_gtk2u_core-2.8.so.0.8.0 是 wxGTK 庫(kù)的一個(gè)共享庫(kù)文件,,它原始的大小為 3980KB. 若采用默認(rèn)的參數(shù)壓縮后的大小為 916KB. 通過(guò)相應(yīng)指定 filter Chain, 可以生成更小些的文件 .

      $ xz libwx_gtk2u_core-2.8.so.0.8.0 
       $ du -k libwx_gtk2u_core-2.8.so.0.8.0.xz 
       916 libwx_gtk2u_core-2.8.so.0.8.0.xz 
       $ xz --x86 --lzma2 libwx_gtk2u_core-2.8.so.0.8.0 
       $ du -k libwx_gtk2u_core-2.8.so.0.8.0.xz 
       856     libwx_gtk2u_core-2.8.so.0.8.0.xz

從上面執(zhí)行結(jié)果來(lái)看,,利用合適的 filter Chain 最終生成的文件大小為 865KB。參數(shù) --x86 --lzma2 就組成了一個(gè) filter Chain,。參數(shù) --x86 是指使用 x86 平臺(tái)的 BCJ filter,,適用于 32 位和 64 位系統(tǒng)。參數(shù) --lzma2 則指使用 lzma2 算法進(jìn)行壓縮,。

回頁(yè)首

使用 xzgrep,xzcat,xzdiff 等實(shí)用工具

xzcat

xzcat 命令其相當(dāng)于 "xz --decompress --stdout" 就是將解壓出的數(shù)據(jù)輸出到標(biāo)準(zhǔn)輸出 (stdout),。下面的例子用來(lái)統(tǒng)計(jì)壓縮 test.txt.xz 文件所包含數(shù)據(jù)的行數(shù),。

$ xzcat test.txt.xz | wc -l  ## count the lines of test.txt

xzgrep

xzgrep 可以用來(lái) grep 壓縮文件所包含的數(shù)據(jù)內(nèi)容。其內(nèi)部就是調(diào)用 grep 命令,,所以參數(shù)和 grep 一致,。下面的例子打印出 xz_pipe_comp_mini.c.xz 中所有包含以"lzma_"開頭單詞的行號(hào)和行內(nèi)容。例:

$ xzgrep -P -n "lzma_\w+" xz_pipe_comp_mini.c.xz 
 8:    lzma_check check = LZMA_CHECK_CRC64; 
 9:    lzma_stream strm = LZMA_STREAM_INIT; /* alloc and init lzma_stream struct */ 
 15:    lzma_easy_encoder (&strm, 6, LZMA_CHECK_CRC64); 
 28:        lzma_action action = in_finished ? LZMA_FINISH : LZMA_RUN; 
 35:            lzma_code (&strm, action); /* compress data */ 
 42:     lzma_end (&strm);

xzless 和 xzmore

這兩個(gè)命令可以分頁(yè)查看壓縮文件中的內(nèi)容,。簡(jiǎn)單的來(lái)說(shuō),,相當(dāng)于

"xzcat <file.xz> | less" 或 "xzcat <file.xz> | more"

xzdiff 和 xzcmp

這兩個(gè)命令用于比較兩個(gè) .xz 文件。內(nèi)部分別調(diào)用命令 diff 和 cmp 來(lái)實(shí)現(xiàn)文件內(nèi)容的比較,。例:

$ xzdiff xz_pipe_comp_mini.c.orig.xz xz_pipe_comp_mini.c.xz 
 20c20 
 <         if (feof (in_file)) 
 --- 
 >         if (feof (in_file))  { 
 21a22 
 >         } 
 $

回頁(yè)首

liblzma API

關(guān)于 liblzma API

liblzma API 提供了 LZMA1/LZMA2 算法的實(shí)現(xiàn),,并具有類似于 Zlib 的 API 接口。也和 gzip,、bzip2 一樣 XZ Utils 是流壓縮格式,。通過(guò) liblzma API 接口,可以相對(duì)簡(jiǎn)單的編程實(shí)現(xiàn)對(duì)數(shù)據(jù)的壓縮和解壓縮,。

使用 liblzma API 壓縮數(shù)據(jù)

使用 liblzma 壓縮數(shù)據(jù)的過(guò)程,,大致過(guò)程如下。

  1. 定義 lzma_stream 結(jié)構(gòu)體變量并使用 LZMA_STREAM_INIT 初始化,,這個(gè) lzma_stream 結(jié)構(gòu)體變量會(huì)在整個(gè)數(shù)據(jù)壓縮過(guò)程中被使用,。有點(diǎn)類似于 C 中標(biāo)準(zhǔn)庫(kù)中文件處理使用的結(jié)構(gòu)體 FILE 。

    lzma_stream strm = LZMA_STREAM_INIT;
  2. 調(diào)用 lzma_easy_encoder 函數(shù)做壓縮準(zhǔn)備工作,。函數(shù)的第一參數(shù)是 lzma_stream. 結(jié)構(gòu)體變量的指針,,第二參數(shù)則指明了期望壓縮率大小。有效值為 [0,9], 數(shù)字越高壓縮率越高,。第三參數(shù)是指明數(shù)據(jù)完整性檢查方法,,LZMA_CHECK_CRC64 可以滿足大多數(shù)情況需要。當(dāng)然,,還有 LZMA_CHECK_CRC32, LZMA_CHECK_SH256 可供選擇,,或者使用 LZMA_CHECK_NONE 不進(jìn)行 數(shù)據(jù)完整性檢查。

    lzma_easy_encoder (&strm, 6, LZMA_CHECK_CRC64);

  3. 通過(guò)設(shè)定 lzma_stream 結(jié)構(gòu)體變量中的 next_in 和 avail_in 字段,,指明待壓縮的數(shù)據(jù)開始 地址和長(zhǎng)度,。

    strm.next_in  = in_buf;  //input buffer address. 
     strm.avail_in = in_len;  //data length.
  4. 通過(guò)設(shè)定 lzma_stream 結(jié)構(gòu)體變量中的 next_out 和 avail_out 字段,指明存放壓縮結(jié)果 buffer 地址和長(zhǎng)度,。

    strm.next_out = out_buf;  //output buffer address 
     strm.avail_out = 4096;    //output buffer length.
  5. 然后通過(guò)調(diào)用 lzma_code 函數(shù)來(lái)壓縮數(shù)據(jù),,或結(jié)束壓縮數(shù)據(jù)。lzma_code 函數(shù)有兩個(gè)參數(shù),,第一個(gè)參數(shù)是 lzma_stream 指針,。而第二個(gè)參數(shù)用來(lái)指明 lzma_code 的動(dòng)作: LZMA_RUN: 進(jìn)行數(shù)據(jù)處理; LZMA_FINISH: 結(jié)束數(shù)據(jù)處理,。

    lzma_code (&strm, LZMA_RUN);    /* compress data */ 
     lzma_code (&strm, LZMA_FINISH); /* Finish operation.*/
  6. 最后要調(diào)用 lzma_end 函數(shù)釋放資源,,退出,。

    lzma_end(&strm);

下面是一段完整的示例程序。所示程序從標(biāo)準(zhǔn)輸入 (stdin) 讀入數(shù)據(jù),,壓縮后寫到標(biāo)準(zhǔn)輸出 (stdout). 為了更便于理解壓縮過(guò)程,,示例代碼省略了所有的異常處理和一些其他次要細(xì)節(jié)。

清單 1. 壓縮數(shù)據(jù)的代碼示例
#include <stdio.h> 
 #include <stdint.h> 
 #include <inttypes.h> 
 #include <stdbool.h> 
 #include <lzma.h> 

 void xz_compress (FILE *in_file, FILE *out_file) { 
    lzma_check check = LZMA_CHECK_CRC64; 
    /* alloc and init lzma_stream struct */ 
    lzma_stream strm = LZMA_STREAM_INIT; 
    
    uint8_t in_buf [4096]; 
    uint8_t out_buf [4096]; 
    bool in_finished = false; 

    /* initialize xz encoder */ 
    lzma_easy_encoder (&strm, 6, LZMA_CHECK_CRC64); 
    while (! in_finished) { 
        /* read incoming data */ 
        size_t in_len = fread (in_buf, 1, 4096, in_file); 

        if (feof (in_file))  { 
            in_finished = true; 
        } 

        strm.next_in = in_buf; 
        strm.avail_in = in_len; 

        /* if no more data from in_buf, flushes the internal xz buffers and 
         * closes the xz data with LZMA_FINISH */ 
        lzma_action action = in_finished ? LZMA_FINISH : LZMA_RUN; 

        /* loop until there's no pending compressed output */ 
        do { 
            strm.next_out = out_buf; 
            strm.avail_out = 4096; 

            lzma_code (&strm, action); /* compress data */ 

            size_t out_len = 4096 - strm.avail_out; 
            fwrite (out_buf, 1, out_len, out_file); /* write compressed data */ 
        }while (strm.avail_out == 0); 
    } 

 lzma_end (&strm); 
 } 

 int main () { 
 xz_compress (stdin, stdout); 
 return 0; 
 }

編譯命令 :

$ gcc -g -o xz_pipe_mini xz_pipe_comp_mini.c -llzma

使用例子 :

$ cat a.txt | xz_pipe_mini > a.txt.xz

使用 liblzma API 解壓數(shù)據(jù)

使用 liblzma 進(jìn)行解壓縮的過(guò)程和壓縮數(shù)據(jù)的過(guò)程基本一致,。主要的區(qū)別是使用 lzma_stream_decoder 函數(shù)代替 lzma_easy_decoder 函數(shù)來(lái)進(jìn)行 decoder 的初始化,。

lzma_stream_decoder (&strm, memory_limit, flags);

lzma_stream_decoder 函數(shù)的第一參數(shù)是數(shù)是 lzma_stream 結(jié)構(gòu)體變量的指針。第二參數(shù)則指明了在解壓縮過(guò)程中使用內(nèi)存的最大值,。若 UINT64_MAX 則為不限制內(nèi)存使用量,。第三參數(shù)用來(lái)指明一些其他 flags 值:

  • LZMA_TELL_NO_CHECK: 如果壓縮數(shù)據(jù)流中未指明數(shù)據(jù)完整性檢查方式,則函數(shù) lzma_code 返回 LZMA_TELL_NO_CHECK ,。

  • LZMA_TELL_UNSUPPORTED_CHECK: 如果壓縮數(shù)據(jù)流使用了不被支持的數(shù)據(jù)完整性檢查方式,,則函數(shù) lzma_code 會(huì)返回 LZMA_TELL_UNSUPPORTED_CHECK 。

  • LZMA_CONCATENATED: 支持多個(gè)壓縮流連接到一個(gè) xz 文件內(nèi),。

下面是一段完整的示例程序,。所示程序從標(biāo)準(zhǔn)輸入 (stdin) 讀入數(shù)據(jù),解壓縮的數(shù)據(jù)寫到標(biāo)準(zhǔn)輸出 (stdout). 示例代碼省略了所有的異常處理和一些其他次要細(xì)節(jié),。

清單 2. 解壓縮數(shù)據(jù)的代碼示例
#include <stdio.h> 
 #include <stdint.h> 
 #include <inttypes.h> 
 #include <stdbool.h> 
 #include <lzma.h> 
 #define IN_BUF_MAX    4096 
 #define OUT_BUF_MAX   4096 
 #define RET_OK        0 
 #define RET_ERROR     1 

 int xz_decompress (FILE *in_file, FILE *out_file) { 
    /* alloc and init lzma_stream struct */ 
    lzma_stream strm = LZMA_STREAM_INIT; 
    uint8_t in_buf [IN_BUF_MAX]; 
    uint8_t out_buf [OUT_BUF_MAX]; 
    bool in_finished = false; 
    bool out_finished = false; 
    lzma_action action; 
    lzma_ret ret_xz; 
    int ret; 

    ret = RET_OK; 

    /* initialize xz decoder */ 
    ret_xz = lzma_stream_decoder (&strm, UINT64_MAX, 
                        LZMA_TELL_UNSUPPORTED_CHECK|LZMA_CONCATENATED );  
    if (ret_xz != LZMA_OK) 
        return RET_ERROR; 

    while ((! in_finished) && (! out_finished)) { 
        /* read incoming data */ 
        size_t in_len = fread (in_buf, 1, IN_BUF_MAX, in_file); 

        if (feof (in_file)) 
            in_finished = true; 

        strm.next_in = in_buf; 
        strm.avail_in = in_len; 

        /* if no more data from in_buf, flushes the 
           internal xz buffers and closes the decompressed data 
           with LZMA_FINISH */ 
        action = in_finished ? LZMA_FINISH : LZMA_RUN; 

        /* loop until there's no pending decompressed output */ 
        do { 
            /* out_buf is clean at this point */ 
            strm.next_out = out_buf; 
            strm.avail_out = OUT_BUF_MAX; 

            /* decompress data */ 
            ret_xz = lzma_code (&strm, action); 

            if ((ret_xz != LZMA_OK) && (ret_xz != LZMA_STREAM_END)) { 
                out_finished = true; 
                ret = RET_ERROR; 
            } else { 
                /* write decompressed data */ 
                size_t out_len = OUT_BUF_MAX - strm.avail_out; 
                fwrite (out_buf, 1, out_len, out_file); 
                if (ferror (out_file)) { 
                    out_finished = true; 
                    ret = RET_ERROR; 
                } 
            } 
        } while (strm.avail_out == 0); 
    } 

    lzma_end (&strm); 
    return ret; 
 } 

 int main () { 
    return xz_decompress (stdin, stdout); 
 }

編譯命令:

$ gcc -g -o xz_pipe_decomp_mini xz_pipe_decomp_mini.c -llzma

使用例子:

$ cat a.txt.xz | xz_pipe_decomp_mini > a.txt

回頁(yè)首

結(jié)束語(yǔ)

本文著重從實(shí)用的角度介紹了 XZ Utils 的主要部分,,還有一些內(nèi)容由于篇幅的原因,沒有提及,。如果您想更深入的研究 XZ Utils,,可以訪問(wèn) XZ Utils 的官方網(wǎng)站,那里可以找到最新的源代碼和更詳盡的文檔,。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多