我正在使用此函数来压缩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。 但其他数字正在正确阅读。
我想要问题的逻辑解决方案。不是关于内存泄漏或如何读取文件或如何写入文件。请为问题提供解决方案。
答案 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
。
当您从文件中读取内容时,您需要查找文件末尾并进行处理。