вот яркий пример (битовые поля), разбирайтесь
Код |
#include <stdio.h>
union CODE // представление одного байта { unsigned char ch; struct BYTE { unsigned b1:1;//младший бит unsigned b3:1; unsigned b4:1; unsigned b5:1; unsigned b6:1; unsigned b7:1; unsigned b8:1;//старший бит } byte; };
void bin(unsigned char c) // печать в двоичном коде { CODE code; code.ch=K; printf("Code %d\n",code.ch); printf("Bit numbers: 8 7 6 5 4 3 2 1 \n"); printf("Bit values: %d %d %d %d %d %d %d %d ", code.byte.b8, code.byte.b7, code.byte.b6, code.byte.b5, code.byte.b4, code.byte.b3, code.byte.b2, code.byte.b1); printf("Number: %d\n",c); }
unsigned char pack(unsigned char *ch,int n) { CODE code; for(int i=0;i<n;i++) { switch(ch[i]) { case 'a': switch(i) { case 0: code.byte.b1=0; code.byte.b2=0; break; case 1: code.byte.b3=0; code.byte.b4=0; break; case 2: code.byte.b5=0; code.byte.b6=0; break; case 3: code.byte.b7=0; code.byte.b8=0; break; } break; case 'b': switch(i) { case 0: code.byte.b1=0; code.byte.b2=1; break; case 1: code.byte.b3=0; code.byte.b4=1; break; case 2: code.byte.b5=0; code.byte.b6=1; break; case 3: code.byte.b7=0; code.byte.b8=1; break; } break; case 'c': switch(i) { case 0: code.byte.b1=1; code.byte.b2=0; break; case 1: code.byte.b3=1; code.byte.b4=0; break; case 2: code.byte.b5=1; code.byte.b6=0; break; case 3: code.byte.b7=1; code.byte.b8=0; break; } break; case 'd': switch(i) { case 0: code.byte.b1=1; code.byte.b2=1; break; case 1: code.byte.b3=1; code.byte.b4=1; break; case 2: code.byte.b5=1; code.byte.b6=1; break; case 3: code.byte.b7=1; code.byte.b8=1; break; } break; } } return code.ch; }
int main() { FILE *fp1,*fp2; fp1=fopen("source.txt","rb"); fp2=fopen("target.txt","wb");
int ch1,i=0; unsigned char ch,ch2[4]; while((ch1=fgetc(fp1))!=EOF) { ch2[i++]=(unsigned char)ch1; if(i==4) { ch=pack(ch2,4); i=0; bin(ch); putchar('\n'); fputc(ch,fp2); } } fcloseall(); return 0; }
|
|