1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<string.h>
5
6 #define UNPACKED_SIZE 160
7 #define PACKED_SIZE 120
8
9 void menu();
10 void pack();
11 void unpack();
12
13 int main()
14 {
15
16 menu();
17 return 0;
18 }
19
20 void unpack()
21 {
22 char UnpackedArray[UNPACKED_SIZE];
23 char PackedArray[PACKED_SIZE];
24 FILE *packed_file = NULL;
25 char Buffer[100];
26 char file_name[100];
27 int i; int pos; int count = 0;
28 int bit[8]; int bit2[8]; int bit3[8];
29
30 printf("Enter the file name:");
31 fgets(Buffer,100,stdin);
32 sscanf(Buffer,"%s",file_name);
33
34
35 packed_file = fopen(file_name,"rb");
36 if(packed_file == NULL)
37 {
38 printf("packed_file is NULL!\n");
39 menu();
40 exit(1);
41 }
42
43 fread(PackedArray,sizeof(char),PACKED_SIZE,packed_file);
44
45 /* bit operation */
46 for(i=0;i<UNPACKED_SIZE;i = i+4)
47 {
48 /* bit represents the bits of the first byte in a 4-bytes unit */
49 bit[0] = (PackedArray[i-count] & 0x01) == 0x01 ? 1:0;
50 bit[1] = (PackedArray[i-count] & 0x02) == 0x02 ? 1:0;
51 bit[2] = (PackedArray[i-count] & 0x04) == 0x04 ? 1:0;
52 bit[3] = (PackedArray[i-count] & 0x08) == 0x08 ? 1:0;
53 bit[4] = (PackedArray[i-count] & 0x10) == 0x10 ? 1:0;
54 bit[5] = (PackedArray[i-count] & 0x20) == 0x20 ? 1:0;
55 bit[6] = (PackedArray[i-count] & 0x40) == 0x40 ? 1:0;
56 bit[7] = (PackedArray[i-count] & 0x80) == 0x80 ? 1:0;
57
58 /* bit2 represents the bits of the next byte */
59 bit2[0] = (PackedArray[i+1-count] & 0x01) == 0x01 ? 1:0;
60 bit2[1] = (PackedArray[i+1-count] & 0x02) == 0x02 ? 1:0;
61 bit2[2] = (PackedArray[i+1-count] & 0x04) == 0x04 ? 1:0;
62 bit2[3] = (PackedArray[i+1-count] & 0x08) == 0x08 ? 1:0;
63 bit2[4] = (PackedArray[i+1-count] & 0x10) == 0x10 ? 1:0;
64 bit2[5] = (PackedArray[i+1-count] & 0x20) == 0x20 ? 1:0;
65 bit2[6] = (PackedArray[i+1-count] & 0x40) == 0x40 ? 1:0;
66 bit2[7] = (PackedArray[i+1-count] & 0x80) == 0x80 ? 1:0;
67
68 /* bit3 works the same way as bit2*/
69 bit3[0] = (PackedArray[i+2-count] & 0x01) == 0x01 ? 1:0;
70 bit3[1] = (PackedArray[i+2-count] & 0x02) == 0x02 ? 1:0;
71 bit3[2] = (PackedArray[i+2-count] & 0x04) == 0x04 ? 1:0;
72 bit3[3] = (PackedArray[i+2-count] & 0x08) == 0x08 ? 1:0;
73 bit3[4] = (PackedArray[i+2-count] & 0x10) == 0x10 ? 1:0;
74 bit3[5] = (PackedArray[i+2-count] & 0x20) == 0x20 ? 1:0;
75 bit3[6] = (PackedArray[i+2-count] & 0x40) == 0x40 ? 1:0;
76 bit3[7] = (PackedArray[i+2-count] & 0x80) == 0x80 ? 1:0;
77
78 UnpackedArray[ i ] = PackedArray[i-count];
79 for(pos=7; pos>=6; pos--)
80 {
81 UnpackedArray[i] &= ~(1<<pos);
82 }
83
84
85 UnpackedArray[ i+1 ] = ( PackedArray[i+1-count] << 2 );
86 for(pos=1; pos>=0; pos--)
87 {
88 if( bit[ pos+6 ] )
89 {
90 UnpackedArray[ i+1 ] |= 1<<pos;
91 }
92 else
93 {
94 UnpackedArray[ i+1 ] &= ~(1<<pos);
95 }
96 }
97 for(pos=7; pos>=6; pos--)
98 {
99 UnpackedArray[ i+1 ] &= ~(1<<pos);
100 }
101
102
103 UnpackedArray[ i+2 ] = ( PackedArray[i+2-count] << 4 );
104 for(pos=3; pos>=0; pos--)
105 {
106 if(bit2[ pos+4 ])
107 {
108 UnpackedArray[ i+2 ] |= 1<<pos;
109 }
110 else
111 {
112 UnpackedArray[ i+2 ] &= ~(1<<pos);
113 }
114 }
115 for(pos=7; pos>=6; pos--)
116 {
117 UnpackedArray[ i+2 ] &= ~(1<<pos);
118 }
119
120
121
122 for(pos=5; pos>=0; pos--)
123 {
124 if(bit3[ pos+2 ])
125 {
126 UnpackedArray[ i+3 ] |= 1<<pos;
127 }
128 else
129 {
130 UnpackedArray[ i+3 ] &= ~(1<<pos);
131 }
132 }
133 for(pos=7; pos>=6; pos--)
134 {
135 UnpackedArray[ i+3 ] &= ~(1<<pos);
136 }
137
138 /* Every time 3 bytes are unpacked to 4 bytes, count will increase 1 */
139 count++;
140
141 }
142
143 for( i=0; i<strlen(UnpackedArray); i++ )
144 {
145 UnpackedArray[i] = SMSToChar(UnpackedArray[i]);
146 }
147
148 printf("The unpacked cstring is:%s \n",UnpackedArray);
149 fclose(packed_file);
150 menu();
151
152 }
153
154 void pack()
155 {
156 char UnpackedArray[UNPACKED_SIZE];
157 char PackedArray[PACKED_SIZE];
158 FILE *packed_file = NULL;
159 char Buffer[UNPACKED_SIZE+100];
160 char file_name[100];
161 int i; int pos; int count = 0;
162 int bit2[8]; int bit3[8]; int bit4[8];
163
164 printf("Enter the file name to save the packed array:");
165 fgets(Buffer,100,stdin);
166 sscanf(Buffer,"%s",file_name);
167
168 printf("Enter the text to pack:");
169 fgets(Buffer,UNPACKED_SIZE+100,stdin);
170 if(Buffer[0] == '\n')
171 {
172 printf("Invalid input: 0 character was entered! \n");
173 menu();
174 exit(1);
175 }
176 /* Remove newline character from the input string */
177 if(strlen(Buffer) > UNPACKED_SIZE)
178 {
179 /*It will be truncated to 159 chars and NULL will be placed in the last element */
180 Buffer[UNPACKED_SIZE-1] = '\0';
181 }
182 else
183 {
184 Buffer[strlen(Buffer)-1] = '\0';
185 }
186
187 sscanf(Buffer,"%[^\n]",UnpackedArray);
188 /* clean the garbage characters in UnpackedArray */
189 for(i=strlen(UnpackedArray);i<UNPACKED_SIZE;i++)
190 {
191 UnpackedArray[i] = 0;
192 }
193
194 packed_file = fopen(file_name,"wb");
195 if(packed_file == NULL)
196 {
197 printf("packed_file is NULL!\n");
198 menu();
199 exit(1);
200 }
201
202 for(i=0;i<strlen(UnpackedArray);i++)
203 {
204 UnpackedArray[i] = CharToSMS(UnpackedArray[i]);
205 }
206
207 /* bit operation */
208 for(i=0;i<UNPACKED_SIZE;i = i+4)
209 {
210 /* bit2 represents the bits of the second byte in every 4 bytes in the text*/
211 bit2[0] = (UnpackedArray[i+1] & 0x01) == 0x01 ? 1:0;
212 bit2[1] = (UnpackedArray[i+1] & 0x02) == 0x02 ? 1:0;
213 bit2[2] = (UnpackedArray[i+1] & 0x04) == 0x04 ? 1:0;
214 bit2[3] = (UnpackedArray[i+1] & 0x08) == 0x08 ? 1:0;
215 bit2[4] = (UnpackedArray[i+1] & 0x10) == 0x10 ? 1:0;
216 bit2[5] = (UnpackedArray[i+1] & 0x20) == 0x20 ? 1:0;
217 bit2[6] = (UnpackedArray[i+1] & 0x40) == 0x40 ? 1:0;
218 bit2[7] = (UnpackedArray[i+1] & 0x80) == 0x80 ? 1:0;
219
220 /* bit3 works the same way as bit2*/
221 bit3[0] = (UnpackedArray[i+2] & 0x01) == 0x01 ? 1:0;
222 bit3[1] = (UnpackedArray[i+2] & 0x02) == 0x02 ? 1:0;
223 bit3[2] = (UnpackedArray[i+2] & 0x04) == 0x04 ? 1:0;
224 bit3[3] = (UnpackedArray[i+2] & 0x08) == 0x08 ? 1:0;
225 bit3[4] = (UnpackedArray[i+2] & 0x10) == 0x10 ? 1:0;
226 bit3[5] = (UnpackedArray[i+2] & 0x20) == 0x20 ? 1:0;
227 bit3[6] = (UnpackedArray[i+2] & 0x40) == 0x40 ? 1:0;
228 bit3[7] = (UnpackedArray[i+2] & 0x80) == 0x80 ? 1:0;
229
230 /* bit4 works the same way as bit3 & bit2*/
231 bit4[0] = (UnpackedArray[i+3] & 0x01) == 0x01 ? 1:0;
232 bit4[1] = (UnpackedArray[i+3] & 0x02) == 0x02 ? 1:0;
233 bit4[2] = (UnpackedArray[i+3] & 0x04) == 0x04 ? 1:0;
234 bit4[3] = (UnpackedArray[i+3] & 0x08) == 0x08 ? 1:0;
235 bit4[4] = (UnpackedArray[i+3] & 0x10) == 0x10 ? 1:0;
236 bit4[5] = (UnpackedArray[i+3] & 0x20) == 0x20 ? 1:0;
237 bit4[6] = (UnpackedArray[i+3] & 0x40) == 0x40 ? 1:0;
238 bit4[7] = (UnpackedArray[i+3] & 0x80) == 0x80 ? 1:0;
239
240 PackedArray[ i-count ] = UnpackedArray[i];
241 for(pos=7; pos>=6; pos--)
242 {
243 if( bit2[ pos-6 ] )
244 {
245 PackedArray[ i-count ] |= 1<<pos;
246 }
247 else
248 {
249 PackedArray[ i-count ] &= ~(1<<pos);
250 }
251 }
252
253 PackedArray[ i+1-count ] = ( UnpackedArray[i+1] >> 2 );
254 for(pos=7; pos>=4; pos--)
255 {
256 if( bit3[ pos-4 ] )
257 {
258 PackedArray[ i+1-count ] |= 1<<pos;
259 }
260 else
261 {
262 PackedArray[ i+1-count ] &= ~(1<<pos);
263 }
264 }
265
266 PackedArray[ i+2-count ] = ( UnpackedArray[i+2] >> 4 );
267 for(pos=7; pos>=2; pos--)
268 {
269 if( bit4[ pos-2 ] )
270 {
271 PackedArray[ i+2-count ] |= 1<<pos;
272 }
273 else
274 {
275 PackedArray[ i+2-count ] &= ~(1<<pos);
276 }
277 }
278
279 /* Every time 4 bytes are packed to 3 bytes, count will increase 1 */
280 count++;
281
282 }
283
284 for(i=strlen(PackedArray);i<PACKED_SIZE;i++)
285 {
286 PackedArray[i] = 0;
287 }
288
289
290 for(i=0;i<PACKED_SIZE;i++)
291 {
292 fwrite(&PackedArray[i],sizeof(char),1,packed_file);
293 }
294 fclose(packed_file);
295
296 menu();
297 }
298
299 void menu()
300 {
301 char Buffer[1024];
302 char choice ;
303
304 printf("Enter P or p: Pack and save a line of text \n");
305 printf("Enter U or u: Unpack and print a line of text \n");
306 printf("Enter Q or q: Quit \n");
307 printf("Enter your choice: ");
308
309 fgets(Buffer,1024,stdin);
310 sscanf(Buffer,"%c",&choice);
311
312 if(choice == 'P' || choice == 'p')
313 {
314 pack();
315 }
316 else if(choice == 'U' || choice == 'u')
317 {
318 unpack();
319 }
320 else if(choice == 'Q' || choice == 'q')
321 {
322 printf("Program Exited. \n");
323 }
324 else
325 {
326 menu();
327 }
328
329
330 }