Bit Operation (Message Compression/Decompression)

  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 }

猜你喜欢

转载自www.cnblogs.com/JasperZhao/p/12914084.html
BIT