减压不能按预期工作

时间:2014-10-28 16:56:36

标签: c arrays algorithm

我正在构建一个简单的字符串压缩器和扩展器。我使用的逻辑如下。 因为如果我们将输入字符限制为(从\ 32到\ 128),所有ASCII字符都可以容纳8位,它们应该只适合7位,这意味着保存1位。我正在使用以下代码。有4个函数第1个压缩文件第2个扩展文件第3个函数创建字符的二进制值并将其分配给数组第4个函数通过分配所有索引清除数组0.压缩工作正常但解压缩工作不正常。想法是存储8个字符,其7位代码为7个字符,8位coed,因此数组的长度为7 * 8 = 56。 例如,字符串ABCDEFGH作为

进入数组
{
  0,1,0,0,0,0,1,    //A is 65 after -32 its now 33 which is 100001 
  0,1,0,0,0,1,0,    //B is 66 after -32 its now 34 which is 100010
  0,1,0,0,0,1,1,
     //and so on 
  0,1,0,1,0,0,0 
                 }

该数组将在8位块中读取,并将以8位字符写入文件中 对于减压反向法应用但由于某种原因它不起作用。我无法弄清楚。

void compressFile(void)
{
    FILE *raw;
    FILE *new;
    int bits[56];
    char path[32];
    int flag=1;
    int i=0;
    char c,ch;

    printf("\nEnter the name of File.\n\t");
    scanf("%s",path);

    cln(bits);
    new = fopen("compressed.txt","w+");
    if (raw = fopen(path,"r+"))
    {
         while (flag)
         {
             for (i=6;i<56;i+=7)
             {
                 c = fgetc(raw);
                 if (c == EOF)
                 {
                    flag = 0;
                    break;
                 }
                 //decreasing the character by 32 which will be added during decompression
                 c -= 32;
                 bin(c,&bits[i]);
            }
            for (i=7; i<56 ; i+= 8)
            {
                ch = 0;
                ch += bits[i] * 128 ;
                ch += bits[i - 1] * 64 ;
                ch += bits[i - 2] * 32 ;
                ch += bits[i - 3] * 16 ;
                ch += bits[i - 4] * 8 ;
                ch += bits[i - 5] * 4 ;
                ch += bits[i - 6] * 2 ;
                ch += bits[i - 7] ;
                fputc(ch,new);
            }
            cln(bits);
        }
        fclose(raw);
        fclose(new);
    }
    else
    {
        printf("\n\tUnexpected Error !!!\n");
        getch();
     }
 }
 void expandFile(void)
 {
     FILE *raw;
     FILE *new;
     int bits[56];
     char path[32];
     int flag=1;
     int i=0;
     char c,ch;

     printf("\nEnter the name of File.\n\t");
     scanf("%s",path);

     cln(bits);
     new = fopen("expanded.txt","w+");
     if (raw = fopen(path,"r+"))
     {
          while (flag)
          {
               for (i=7;i<56;i+= 8)
               {
                    c = fgetc(raw);
                    if (c == EOF)
                    {
                       flag = 0;
                       break;
                    }
                    bin(c,&bits[i]);
              }
              for (i=6; i<56 ; i+= 7)
              {
                   ch = 0;
                   ch += bits[i] * 64 ;
                   ch += bits[i - 1] * 32 ;
                   ch += bits[i - 2] * 16 ;
                   ch += bits[i - 3] * 8 ;
                   ch += bits[i - 4] * 4 ;
                   ch += bits[i - 5] * 2 ;
                   ch += bits[i - 6] * 1 ;
                   //32 is added which was subtracted
                   ch += 32;
                   fputc(ch,new);
              }
              cln(bits);
        }
        fclose(raw);
        fclose(new);
     }
     else
     {
          printf("\n\tUnexpected Error !!!\n");
          getch();
      }
    }
    void cln(int *p)
    {
        int i;
        for (i=0;i<56;i++)
        {
            *(p + i) = 0;
        }
    }
    void bin(char n,int *p)
    {
        int q = 0;
        while (n > 1)
        {
            *(p - q) = n % 2;
            n /= 2;
            q ++;
         }
        *(p - q) = 1;
     }

1 个答案:

答案 0 :(得分:2)

您的bin正在对bits[0]中的 low 顺序位进行编码,但您的编码和解码功能会按相反顺序对其进行处理。

您应该查看bitshift运算符(<<>>)。你可以将东西存储在long中,而不是需要一个数组,你可以避免所有的乘法。

另外,如果您假设输入小于128,则无需减去32然后再重新添加。