Kamis, 17 September 2015

Cara Compress File Menjadi Gzip dengan ZLIB dan C

Diperlukan waktu yang sangat lama untuk mempelajari algoritma yang efektif untuk kompresi file. Maka dari itu, akan lebih baik jika kita menggunakan algoritma yang sudah ada jika kita menginginkan program kita memiliki fungsional seperti itu. Ada beberapa library yang bisa kita gunakan secara gratis untuk melakukan kompresi data. Dengan library tersebut, kita cukup memanggil fungsi yang telah disediakan sesuai dengan kebutuhan, tanpa perlu mengimplementasikan algoritma kompresi apapun.

Salah satu library yang bisa digunakan untuk menangani masalah kompresi adalah zlib. Zlib menyediakan fungsi untuk mengompres dan mengekstrak data dengan algoritma deflate, huffman dan RLE. Untuk menangani archive dalam wujud file, zlib hanya menyediakan beberapa fungsi manipulasi archive GZip (.gz). Jadi untuk tulisan kali ini kita cukup mempelajari cara dasar untuk mengompres file menjadi archive GZip.


#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <zlib.h>

int main(int argc, char **argv)
{
 gzFile   outfile;
 FILE  *infile;
 void  *inbuffer;
 size_t   hasread;
 
 printf("Mengompres contoh.txt menjadi contoh.txt.gz ...\n");
 infile = fopen("contoh.txt","rb");
 if (!infile){
  printf("Gagal membuka file input\n");
  return -1;
 }
 outfile = gzopen("contoh.txt.gz","wb9");
 if (!outfile){
  printf("Gagal membuat file output\n");
  return -1;
 }
 inbuffer = malloc(8192);
 if (!inbuffer){
  printf("Gagal membuat buffer untuk file input\n");
  return -1;
 }
 if (gzbuffer(outfile, 8192) != 0){
  printf("Gagal membuat buffer untuk file input\n");
  return -1;
 }
 do{
  hasread = fread (inbuffer, 1, 8192, infile);
  if (hasread)
   gzwrite(outfile, inbuffer, hasread);
 }while(!feof(infile));
 
 gzclose(outfile);
 printf("Berhasil\n");
}
Compile dan link kode diatas dengan header dan library dari situs resmi zlib.
http://www.zlib.net/

Maka hasilnya akan nampak seperti berikut..


Hmm, mungkin kode di atas masih terlalu sulit untuk dipahami?
Baik, kita mulai dari tutorial dasarnya saja.


#include <string.h>
#include <stdio.h>
#include <zlib.h>

char *indata  =
 "Pendidikan memiliki peranan penting dalam meningkatkan "
 "sumberdaya manusia. Pendidikan adalah hak bagi setiap m"
 "anusia dan oleh karena itu setiap manusia berhak meneri"
 "ma pendidikan yang layak. Namun sangat disayangkan bahw"
 "a kualitas pendidikan di beberapa negara masih terbilan"
 "g rendah. Setiap siswa memiliki keterampilan belajar ya"
 "ng berbeda-beda dan pada umumnya cenderung kurang termo"
 "tivasi untuk menggunakan media buku dalam kegiatan bela"
 "jar. Sehingga, perlu adanya inovasi untuk mengembangkan"
 " media belajar yang menarik bagi siswa.";

int main(int argc, char **argv)
{
 gzFile  outfile;
 
 printf("Mengompres data ke file data.txt.gz ...\n");
 outfile = gzopen("data.txt.gz","wb9");
 gzbuffer(outfile, 8192);
 gzwrite(outfile, indata, strlen(indata) + 1);
 gzclose(outfile);
 printf("OK");
}

Untuk membuat ataupun membuka file baru, kita butuh objek bernama gzFile, lalu objek tersebut kita gunakan untuk membuka file baru dengan fungsi gzopen. Sekilas bentuknya mirip dengan fungsi fopen(), ya. Hanya saja cara penggunaan modenya agak beda. gunakan "rb" untuk membaca arsip, atau "wb" untuk menulis arsip, angka 0-9 juga dapat disertakan untuk menentukan compression level.

gzFile gzopen (const char *path, const char *mode);

Fungsi di atas dinyatakan berhasil apabila tidak mengembalikan nilai 0. gzFile yang telah digunakan dengan gzopen() kemudian harus diatur ukuran buffer internalnya. Buffer ini digunakan untuk membantu proses kompresi ataupun ekstraksi. Menurut dokumentasi, ukuran yang disarankan adalah 8192 bytes.

int gzbuffer (gzFile file, unsigned size);

Ukuran buffer internal pada fungsi di atas ditentukan oleh parameter size. Jika fungsi berhasil, maka akan mengembalikan nilai 0. Setelah itu, kita bisa melakukan proses kompresi data dengan gzwrite()


int gzwrite (gzFile file, voidpc buf, unsigned len);

parameter file adalah objek gzFile yang telah dibuka dengan gzopen() dan telah diatur besar buffer internalnya. Parameter buf adalah lokasi data yang akan dikompres, jumlah data yang akan dikompres ditentukan oleh parameter len. Return value berupa jumlah data yang berhasil dikompres, jika error maka nilai yang dikembalikan == 0.

Setelah semuanya selesai, jangan lupa akhiri dengan fungsi  gzclose().


int gzclose (gzFile file);


Compile dan link, daaannn... :)


Untuk kode yang sebelumnya, coba pelajari sendiri, ya. Buat latihan :)
Selamat mencoba, dan tunggu tutorial berikutnya untuk cara dekompres nya, ya... :)
Load disqus comments

0 comments