作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在构建一个简单的字符串压缩器和扩展器。我使用的逻辑如下。如果我们将输入字符限制为(从\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/
我是一名优秀的程序员,十分优秀!