压缩数字:读错误

时间:2014-10-14 18:48:02

标签: c numbers compression

我正在使用此函数来压缩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。 但其他数字正在正确阅读。

更新

我想要问题的逻辑解决方案。不是关于内存泄漏或如何读取文件或如何写入文件。请为问题提供解决方案。

1 个答案:

答案 0 :(得分:0)

您实际上并没有运行您在问题中发布的代码。发布代码是一件好事,但前提是它是您运行的实际代码并且遇到问题,并且如果您将其逐字剪切并粘贴到问题中。

一旦我将Read=放在它所属的引号内,您的代码就不会按照您的声明执行。当你输入131时,它会返回131.你没有问题。好吧,至少不是131。

您的代码存在问题,除了偏离引号之外的字符串。

此:

    if (c <= 0) {
        printf("c is <= 0 in uncompress1()\n");
        exit(0);
    }

根本不应该在那里。正如已经指出的那样,<中的<=是无意义的,因为c是无符号的,但更重要的是,零是编码数据中完全有效的值,例如只要数字的低七位都是零。数字128代码为129 0。

对于零个案,您应该移除if(!r){部分,然后简单地制作循环do while而不是while

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