LAMPIRAN A
LISTING PROGRAM
FUNGSI
public void StopWatchStart() {
stopWatch.Reset(); stopWatch.Start();
Cursor.Current = Cursors.WaitCursor; txtLog.Text = "";
}
public void StopWatchStop(string Title) {
stopWatch.Stop(); lblWaktu.Text = Title;
txtWaktu.Text = stopWatch.Elapsed.ToString(); Cursor.Current = Cursors.Arrow;
}
public string toBiner(int desimal, int digit) {
string biner = ""; string buf = ""; int hasilBagi = desimal; int p, sisa;
while (hasilBagi > 1) {
if (hasilBagi % 2 == 1) {
hasilBagi -= 1;
hasilBagi = hasilBagi / 2; biner = "1" + biner; }
else {
hasilBagi = hasilBagi / 2; biner = "0" + biner; }
}
biner = hasilBagi + biner;
p = biner.Length / 8; sisa = biner.Length % 8;
if (sisa != 0) p += 1;
if (biner.Length < (p * 8))
for (int i = 1; i <= (p * 8) - biner.Length; i++) buf += "0";
if (digit > 0) {
int len = biner.Count(); if (digit > len)
{
for (int i = 0; i < digit - len; i++) biner = "0" + biner;
} }
return biner; }
public int toDecimal(string biner) {
int result = 0; int num = 0;
for (int i = 1; i <= biner.Length; i++) {
num = biner[i - 1] - 48;
result += Convert.ToInt16(Math.Pow(2, biner.Length - i)) * num; }
return result; }
KARAKTER SET
public string BuatKarakterSet(String Teks) {
String R = ""; Boolean Yes;
for (int i = 0; i < Teks.Length; i++) {
Yes = false;
for (int j = 0; j < R.Length; j++) {
if (Teks[i] == R[j]) {
Yes = true; break; } }
if (Yes == false) R += Teks[i]; }
return R; }
// Hitung Frekuensi Karakter
public List<clsUnary> HitungFreqKarakter(String PT, String KS) {
List<clsUnary> R = new List<clsUnary>(); int Freq;
for (int j = 0; j < KS.Length; j++) {
Freq = 0;
{
if (KS[j] == PT[i]) Freq += 1; }
R.Add(new clsUnary(KS[j], Freq)); }
return R; }
public List<clsUnary> UrutkanKS(List<clsUnary> L, char Arah) {
char Kar; int Freq;
if (Arah == 'A') {
for (int j = 0; j < L.Count - 1; j++) for (int i = j + 1; i < L.Count; i++) if (L[j].Freq > L[i].Freq) {
Kar = L[j].Kar; Freq = L[j].Freq; L[j].Kar = L[i].Kar; L[j].Freq = L[i].Freq; L[i].Kar = Kar; L[i].Freq = Freq; }
}
else if (Arah == 'Z') {
for (int j = 0; j < L.Count - 1; j++) for (int i = j + 1; i < L.Count; i++) if (L[j].Freq < L[i].Freq) {
Kar = L[j].Kar; Freq = L[j].Freq; L[j].Kar = L[i].Kar; L[j].Freq = L[i].Freq; L[i].Kar = Kar; L[i].Freq = Freq; }
}
return L; }
public List<clsUnary> BuatKode(List<clsUnary> L) {
string temp;
for (int j = 0; j < L.Count; j++) {
temp = "";
return L; }
public List<clsUnary> BuatKodeDelta(List<clsUnary> L) {
string temp; int N, S;
for (int j = 0; j < L.Count; j++) {
temp = "";
temp += toBiner(j + 1, 0); L[j].Kode = temp.Remove(0, 1);
N = temp.Length;
L[j].Kode = toBiner(N, 0) + L[j].Kode;
S = toBiner(N, 0).Length - 1;
for (int i = 0; i < S; i++) L[j].Kode = "0" + L[j].Kode;
}
return L; }
KOMPRESI
public void Kompres() {
int Pad; Log = "";
CB = new List<string>(); CT = "";
CTB = ""; JlhBit_CT = 0;
UN = HitungFreqKarakter(PT, KS); UN = UrutkanKS(UN, 'Z');
if (rdbElias.Checked) UN = BuatKodeDelta(UN); else if (rdbUnary.Checked) UN = BuatKode(UN);
for (int j = 0; j < PT.Count(); j++) {
for (int i = 0; i < UN.Count(); i++) {
if (PT[j] == UN[i].Kar) {
CB.Add(UN[i].Kode); break;
}
// Buat Compressed Binary for (int i = 0; i < CB.Count(); i++) {
CTB += CB[i];
JlhBit_CT += CB[i].Count(); }
JlhKarCB = Convert.ToInt16(Math.Ceiling(Convert.ToDouble(JlhBit_CT) / 8));
// Buat Compressed Text string b = "";
b = CTB.Substring((JlhKarCB - 1) * 8, JlhBit_CT - ((JlhKarCB - 1) * 8)); int x = b.Length;
Pad = 8 - x;
for (int i = 0; i < Pad; i++) {
CTB += '1'; }
CBytes = new byte[JlhKarCB + 1];
for (int i = 0; i < JlhKarCB; i++) {
b = CTB.Substring(i * 8, 8);
CT += Convert.ToChar(toDecimal(b)); CBytes[i] = Convert.ToByte(toDecimal(b)); }
CT += Convert.ToChar(Pad + 48); CTB += toBiner(Pad + 48, 8);
// Simpan ke Array Byt
for (int i = 0; i < CT.Count(); i++) CBytes[i] = Convert.ToByte(CT[i]);
// Cetak Hasil
for (int i = 0; i < UN.Count; i++)
Log += UN[i].Kar + "\t" + UN[i].Freq + "\t" + UN[i].Kode + "\n";
RC = Convert.ToDouble(CTB.Count() / 8) / Convert.ToDouble(PjgTeks); RC = Convert.ToDouble(String.Format("{0:0.0000}", RC));
CR = Convert.ToDouble(CTB.Count() / 8) / Convert.ToDouble(PjgTeks) * 100; CR = Convert.ToDouble(String.Format("{0:0.00}", CR));
Red = Convert.ToDouble(PjgTeks - (CTB.Count() / 8)) / Convert.ToDouble(PjgTeks) * 100; Red = Convert.ToDouble(String.Format("{0:0.00}", Red));
txtPad.Text = Pad.ToString(); txtCTB.Text = CTB;
txtCT.Text = CT;
txtJlhBit_CT.Text = CTB.Count().ToString(); txtJlhKar_CT.Text = (CTB.Count() / 8).ToString(); txtRC.Text = RC.ToString();
txtCR.Text = CR.ToString() + " %"; txtRed.Text = Red.ToString() + " %"; txtLog.Text = Log;
DEKOMPRESI
public string CT_ke_CTB() {
CT = txtCT.Text.Trim(); // Substring(0, txtCT.Text.Length); CTB = "";
TambahBit = Convert.ToInt16(CT[CT.Count() - 1]) - 48 ;
for (int i = 0; i < CT.Count() - 1; i++) {
CTB += toBiner(Convert.ToInt16(CT[i]), 8); }
if (TambahBit > 0) {
CTB = CTB.Remove(CTB.Length - TambahBit, TambahBit); }
return CTB; }
public void Dekompres(List<clsUnary> Tabel, string CTB) {
String Hasil = ""; Log = "";
if (rdbElias.Checked) {
//CTB = txtCTB.Text;
string S = ""; string KT; char Kar = 'A'; int TC = 0; int Index = 0; Boolean Ketemu;
for (int i = 0; i < CTB.Count(); i++) {
S += CTB[i]; TC++;
Ketemu = false;
for (int j = 0; j < Tabel.Count(); j++) {
try {
if (S == Tabel[j].Kode.Substring(0, TC)) {
KT = S;
Kar = Tabel[j].Kar;
Log += "Bit " + Index + " ke " + (Index + TC - 1) + " = " + KT + "\n"; Ketemu = true;
break; } } catch { } }
if (Ketemu == false) {
Hasil += Kar; S = ""; TC = 0; Index = i; i--;
Log += "========================= Karakter : " + Kar + "\n\n"; }
}
Log += "======================= Karakter : " + Kar + "\n"; Hasil += Kar;
}
else if (rdbUnary.Checked) {
//CTB = txtCTB.Text;
string S = ""; char Kar = 'A'; int TC = 0;
for (int i = 0; i < CTB.Count(); i++) {
S += CTB[i]; if (CTB[i] == '0') {
for (int j = 0 ; j < Tabel.Count(); j++) if (S == Tabel[j].Kode)
{
Kar = Tabel[j].Kar; Hasil += Kar; break; } TC++;
Log += "Deretan Bit ke " + i + "\t: " + S + "\n" + "===================== Karakter : " + Kar + "\n";
S = ""; } } }
JlhBit_PT = (Hasil.Count() * 8);
JlhBit_CT = Convert.ToInt16(txtJlhBit_CT.Text); PjgTeks = Hasil.Count();
CR = Convert.ToDouble(JlhBit_CT / 8) / Convert.ToDouble(PjgTeks) * 100; CR = Convert.ToDouble(String.Format("{0:0.00}", CR));
Red = Convert.ToDouble(PjgTeks - (JlhBit_CT / 8)) / Convert.ToDouble(PjgTeks) * 100; Red = Convert.ToDouble(String.Format("{0:0.00}", Red));
txtCR.Text = CR.ToString() + " %"; txtRed.Text = Red.ToString() + " %";
txtPad.Text = TambahBit.ToString(); txtPT.Text = Hasil;
txtJlhKar_PT.Text = PjgTeks.ToString(); txtJlhBit_PT.Text = JlhBit_PT.ToString(); txtCTB.Text = CTB;