我正在构建一个简单的字符串压缩器和扩展器。我使用的逻辑如下。 因为如果我们将输入字符限制为(从\ 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;
}
答案 0 :(得分:2)
您的bin
正在对bits[0]
中的 low 顺序位进行编码,但您的编码和解码功能会按相反顺序对其进行处理。
您应该查看bitshift运算符(<<
和>>
)。你可以将东西存储在long
中,而不是需要一个数组,你可以避免所有的乘法。
另外,如果您假设输入小于128,则无需减去32然后再重新添加。