gpt4 book ai didi

c - 减压没有按预期工作

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:59:05 24 4
gpt4 key购买 nike

我正在构建一个简单的字符串压缩器和扩展器。我使用的逻辑如下。如果我们将输入字符限制为(从\32 到\128),所有 ASCII 字符都可以放入 8 位,因此它们应该只放入 7 位,这意味着节省了 1 位。我正在使用以下代码。有 4 个函数第一个压缩文件第二个扩展文件第三个函数创建字符的二进制值并将其分配给数组第四个函数通过分配所有索引 0 来清除数组。压缩工作正常但解压缩工作不正常。这个想法是将 8 个字符及其 7 位代码存储为 7 个字符和 8 位代码,因此数组的长度为 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
}

这个数组将在八位 block 中读取,并将作为 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;
}

最佳答案

你的 bin正在对 bits[0] 中的 位进行编码,但您的编码和解码函数将其视为倒序。

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

此外,如果您假设输入小于 128,则无需减去 32 然后再次相加。

关于c - 减压没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26614090/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com