#include #include #define MULTI 3 #define BITOUT "bitout.txt" #define ASCIIOUT "asciiout.txt" void encode(int fd, char codes[]); void decode(int fd, char codes[]); int main(int argc, char **argv) { int fd; char *filename; char codes[] = "abcdefghij"; if(argc < 3) { printf("wrong\n"); exit(-1); } fd = open(argv[2], O_RDONLY, 0); if(fd > 0) { printf("file opened\n"); } else { printf("invalid filename\n"); exit(-1); } if(strcmp(argv[1], "encode") == 0) { encode(fd, codes); } else if(strcmp(argv[1], "decode") == 0) { decode(fd, codes); } else { printf("wrong\n"); } } void encode(int fd, char codes[]) { int fdout; char letter; char prevletter; int test; int code; unsigned int similar=1; unsigned char writebyte= '\0'; int bitindex = 6; int count=0; fdout = creat(BITOUT, 0600); fdout = open(BITOUT, O_WRONLY, 0); printf("encode\n"); test = read(fd, &prevletter, 1); while(test != 0) { test = read(fd, &letter, 1); if(letter == prevletter) { similar++; } else { if(similar > 1) { writebyte |= (MULTI << (bitindex)); bitindex -=2; if(bitindex < 0) { bitindex = 6; write(fdout, &writebyte, 1); writebyte = '\0'; } if(bitindex > 0) { writebyte |= (similar << (bitindex-2)); bitindex -=4; } else { writebyte |= similar >> 2; write(fdout, &writebyte, 1); writebyte = '\0'; bitindex = 6; writebyte |= code << (bitindex); } if(bitindex < 0) { bitindex = 6; write(fdout, &writebyte, 1); writebyte = '\0'; } similar = 1; } count = 0; code = 0; while(count < 11 && code == 0) { if(codes[count] == prevletter) code = count+1; count++; } if(bitindex > 0) { writebyte |= code << (bitindex-2); bitindex -=4; } else { writebyte |= code >> 2; write(fdout, &writebyte, 1); writebyte = '\0'; bitindex = 6; writebyte |= code << (bitindex); bitindex -=2; } if(bitindex < 0) { bitindex = 6; write(fdout, &writebyte, 1); writebyte = '\0'; } } prevletter = letter; } if(bitindex != 6) { writebyte |= 0; write(fdout, &writebyte, 1); } close(fdout); } void decode(int fd, char codes[]) { int fdout; unsigned char byte='\0'; unsigned char prevbyte='\0'; unsigned char temp; int test; int code; unsigned int similar=1; char writechar= '\0'; int bitindex = 6; int i; fdout = creat(ASCIIOUT, 0600); fdout = open(ASCIIOUT, O_WRONLY, 0); test = read(fd, &prevbyte, 1); test = read(fd, &byte, 1); while(test != 0) { if( ((prevbyte >> bitindex)& MULTI )== MULTI) { bitindex -= 2; if(bitindex < 0) { bitindex = 6; prevbyte = byte; test = read(fd, &byte, 1); } if(bitindex < 2) { similar = ((prevbyte & 3) << 2) | (byte >> 6); } else { temp = prevbyte << (6-bitindex); similar = temp >> (4); } bitindex += 8; bitindex -= 4; bitindex %= 8; if(bitindex > 2) { prevbyte = byte; test = read(fd, &byte, 1); } } if(bitindex < 2) { code = ((prevbyte & 3) << 2) | (byte >> 6); } else { temp = prevbyte << (6 - bitindex); code = temp >> (4); } bitindex += 8; bitindex -= 4; bitindex %= 8; if(bitindex > 2) { prevbyte = byte; test = read(fd, &byte, 1); } for(i=0; i