压缩数字:读错误

我正在使用此函数来压缩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

当您从文件中读取文件时,您需要查找文件结尾并进行处理。