-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdecoder.java
More file actions
155 lines (129 loc) · 3.31 KB
/
decoder.java
File metadata and controls
155 lines (129 loc) · 3.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
class Huffman_Node1
{
int data;
long frequency;
Huffman_Node1 left;
Huffman_Node1 right;
Huffman_Node1(int key,long freq_value)
{
data=key;
frequency=freq_value;
left=null;
right=null;
}
Huffman_Node1(long freq_value,Huffman_Node1 l,Huffman_Node1 r)
{
frequency=freq_value;
left=l;
right=r;
}
}
public class decoder {
Huffman_Node1 decode_root=new Huffman_Node1(-1,-1);
//Huffman_Node decode_temp;
void generate_decode_tree(String code_table) throws IOException
{
System.out.println("creating decode tree");
FileReader fr1=new FileReader(code_table);
BufferedReader br1=new BufferedReader(fr1);
String s;
//int[] decode_tree=new int[1000000];
Huffman_Node1 decode_temp=decode_root;
while((s=br1.readLine())!=null)
{
String s1[]=s.split(" ");
//System.out.println("s1[1] is "+s1[1]+"\t"+s1[0]);
for(int i1=0;i1<(s1[1].length());i1++)
{
if(s1[1].charAt(i1)=='0')
{
if(decode_temp.left==null)
{
Huffman_Node1 temp=new Huffman_Node1(-1,-1);
decode_temp.left=temp;
}
decode_temp=decode_temp.left;
}
else if(s1[1].charAt(i1)=='1')
{
if(decode_temp.right==null)
{
Huffman_Node1 temp=new Huffman_Node1(-1,-1);
decode_temp.right=temp;
}
decode_temp=decode_temp.right;
}
}
decode_temp.data=Integer.parseInt(s1[0]);
decode_temp=decode_root;
}
br1.close();
fr1.close();
}
void generate_decode_msg(String encoded_file) throws IOException
{
System.out.println("generating decode msg");
StringBuilder sb=new StringBuilder();
//FileReader fr=new FileReader(encoded_file);
BufferedInputStream br=new BufferedInputStream(new FileInputStream(encoded_file));
int b;
while((b=br.read()) != -1)
{
int shift=0x80;
while((shift!=1) && ((b & shift)==0))
{
sb.append('0');
shift=shift>>1;
}
sb.append(Integer.toBinaryString(b));
//System.out.println("appedn");
}
br.close();
//fr.close();
//System.out.println("after while loop"+sb.substring(1,10));
FileWriter fw=new FileWriter("decoded.txt");
BufferedWriter bw=new BufferedWriter(fw);
Huffman_Node1 temp=decode_root;
for(int i=0;i<(sb.length());i++)
{
//System.out.println("in for loop");
if(sb.charAt(i)=='0')
{
temp=temp.left;
}
else
{
temp=temp.right;
}
if(temp.left==null && temp.right==null)
{
//System.out.println("tem data is "+temp.data);
bw.write(Integer.toString(temp.data));
bw.newLine();
temp=decode_root;
}
}
//System.out.println("after for loop");
bw.close();
fw.close();
}
public static void main(String args[]) throws IOException
{
long start_time=System.nanoTime();
String encode_file_name=args[0];
String code_table_file=args[1];
decoder decoder=new decoder();
decoder.generate_decode_tree(code_table_file);
decoder.generate_decode_msg(encode_file_name);
System.out.println("elapsed time for entire decoding process is "+(System.nanoTime()-start_time)*Math.pow(10, -6));
System.out.println("Generated decoded msg");
}
}