压缩数字:读错误
我正在使用此函数来压缩Numbers:
unsigned char *MyCompress(unsigned int num, unsigned char *buffer){ int i = 0; unsigned int r = num; unsigned char temp; unsigned char s[5]; printf("received %d to compress\n", num); if(!r){ *buffer++ = 0; return buffer; } while (r){ s[i] = r & 127; r >>= 7; printf("s[%d]=%d; r=%d\n", i, s[i], r); i++; } while (--i >= 0){ temp = (unsigned char)(s[i] | (i ? 128 : 0)); printf("temp=%d\n", temp); *buffer++=temp; } return buffer; }
//现在发送打印此号码
unsigned char *abc, *abc2; abc=(unsigned char *)malloc(10); abc2=abc; len=384; abc = MyCompress(len, abc); fwrite(abc2, 1, (abc-abc2), fp);
//输出
s[0]=0; r=3; s[1]=3; r=0 temp=131 temp=0
现在阅读时出错:
unsigned int MyDeCompress(FILE *fp){ unsigned int c; unsigned int num = 0; do{ c = (unsigned) fgetc(fp); printf(Read="%d\n", c); if (c <= 0) { printf("c is < 0 in uncompress1()\n"); exit(0); } num <<= 7; num |= c & 127; printf("uncompress: c = %d num = %d\n", c, num); if (!num) break; }while (c & 128); printf("Returning %d\n", num); return num; }
//输出
Read=131 uncompress: c = 3 num = 3 Returning 3
为什么要返回3.我怎样才能再次获得384.但其他数字正在正确阅读。
更新
我想要问题的逻辑解决方案。 不是关于内存泄漏或如何读取文件或如何写入文件。 请为问题提供解决方案。
您实际上没有运行您在问题中发布的代码。 发布代码是一件好事,但前提是它是您运行的实际代码并且遇到问题,并且如果您将其逐字剪切并粘贴到问题中。
一旦我将Read=
放在它所属的引号内,你的代码就不会按照你声称的那样做。 当你输入131时,它会返回131.你没有问题。 好吧,至少不是131。
您的代码存在问题,除了在引号之外偏离的字符串。
这个:
if (c <= 0) { printf("c is <= 0 in uncompress1()\n"); exit(0); }
不应该在那里。 正如已经指出的那样, <=
是无意义的,因为c
是无符号的,但更重要的是,零是编码数据中完全有效的值,例如,只要数字的低七位全为零。 数字128代码为129 0。
对于零情况,你应该删除if(!r){
section并简单地使循环do while
不是while
。
当您从文件中读取文件时,您需要查找文件结尾并进行处理。