/** * 将压缩数据之后的文件还原成压缩之前的文件 */ void lz77_uncompress_test(){ FILE *file = NULL; file = fopen("D:/c_note.lz77", "rb"); if (file == NULL) { printf("open file err\n"); return; } fseek(file, 0, SEEK_END); long size = ftell(file); fseek(file, 0, SEEK_SET); unsigned char *buf = (unsigned char *)malloc(size * sizeof(unsigned char)); memset(buf, 0, size * sizeof(unsigned char)); fread((void *)buf, size, sizeof(unsigned char), file); fclose(file); printf("%s\n", "read to buf end"); unsigned char * original; if((size = lz77_uncompress(buf, &original)) <= 0) { printf("%s\n", "uncompress fail"); return; } // printf("%s\n", *original); FILE *file2 = NULL; file2 = fopen("D:/c_note2.txt", "wb"); if (file2 == NULL) { printf("%s\n", "write file open err"); return; } fwrite((const void *)(original), size, sizeof(unsigned char), file2); printf("%s\n", "write file end"); fclose(file2); return; }
int main(int argc, char **argv) { FILE *fp; unsigned char original[DATSIZ], *compressed, *restored; int csize, osize, rsize, c, i; /***************************************************************************** * * * Read some data to compress. * * * *****************************************************************************/ if ((fp = fopen("sample.txt", "r")) == NULL) return 1; i = 0; while ((c = getc(fp)) != EOF && i < DATSIZ) { original[i] = c; i++; } osize = i; fclose(fp); /***************************************************************************** * * * Compress the data using Huffman coding. * * * *****************************************************************************/ fprintf(stdout, "Compressing with Huffman coding\n"); fprintf(stdout, "Compressing..."); if ((csize = huffman_compress(original, &compressed, osize)) < 0) { fprintf(stdout, "\n"); return 1; } fprintf(stdout, "Done\n"); fprintf(stdout, "Uncompressing..."); if ((rsize = huffman_uncompress(compressed, &restored)) < 0) { fprintf(stdout, "\n"); free(compressed); return 1; } fprintf(stdout, "Done\n"); fprintf(stdout, "osize=%d, csize=%d, rsize=%d\n", osize, csize, rsize); if (rsize != osize) { fprintf(stdout, "Data was not properly restored\n"); free(compressed); free(restored); return 1; } else { for (i = 0; i < rsize; i++) { if (original[i] != restored[i]) { fprintf(stdout, "Data was not properly restored\n"); if (isgraph(original[i])) fprintf(stdout, "original[%d]=\"%c\"\n", i, original[i]); else fprintf(stdout, "original[%d]=0x%02x\n", i, original[i]); if (isgraph(restored[i])) fprintf(stdout, "restored[%d]=\"%c\"\n", i, restored[i]); else fprintf(stdout, "restored[%d]=0x%02x\n", i, restored[i]); free(compressed); free(restored); return 1; } } } fprintf(stdout, "Data was restored OK\n"); free(compressed); free(restored); /***************************************************************************** * * * Compress some data using LZ77. * * * *****************************************************************************/ fprintf(stdout, "Compressing with LZ77\n"); fprintf(stdout, "Compressing..."); if ((csize = lz77_compress(original, &compressed, osize)) < 0) return 1; fprintf(stdout, "Done\n"); fprintf(stdout, "Uncompressing..."); if ((rsize = lz77_uncompress(compressed, &restored)) < 0) { fprintf(stdout, "\n"); free(compressed); return 1; } fprintf(stdout, "Done\n"); fprintf(stdout, "osize=%d, csize=%d, rsize=%d\n", osize, csize, rsize); if (rsize != osize) { fprintf(stdout, "Data was not properly restored\n"); free(compressed); free(restored); return 1; } else { for (i = 0; i < rsize; i++) { if (original[i] != restored[i]) { fprintf(stdout, "Data was not properly restored\n"); if (isgraph(original[i])) fprintf(stdout, "original[%d]=\"%c\"\n", i, original[i]); else fprintf(stdout, "original[%d]=0x%02x\n", i, original[i]); if (isgraph(restored[i])) fprintf(stdout, "restored[%d]=\"%c\"\n", i, restored[i]); else fprintf(stdout, "restored[%d]=0x%02x\n", i, restored[i]); free(compressed); free(restored); return 1; } } } fprintf(stdout, "Data was restored OK\n"); free(compressed); free(restored); return 0; }