/ / ¿Por qué mi compresión muestra un error? - c, compresión, descompresión

¿Por qué mi compresión muestra un error? - c, compresión, descompresión

El Código también se proporciona aquí y funciona perfectamente y muestra errores. http://ideone.com/gWEoIV

#include <stdio.h>
#include <stdlib.h>

unsigned char *MyCompress(unsigned int num, unsigned char *buffer);
unsigned int MyDeCompress(unsigned char **buffer);

int main(void) {
unsigned char *abc, *abc2;
unsigned len;
abc=(unsigned char *)malloc(12);
abc2=abc;
len=25960;
abc = MyCompress(len, abc);
len=385;
abc = MyCompress(len, abc);
len=900;
abc = MyCompress(len, abc);
len=20560;
abc = MyCompress(len, abc);
len=384;
abc = MyCompress(len, abc);
abc=abc2;

len = MyDeCompress(&abc);
len = MyDeCompress(&abc);
len = MyDeCompress(&abc);
len = MyDeCompress(&abc);
len = MyDeCompress(&abc);


return 0;
}

unsigned int MyDeCompress(unsigned char **buffer){
unsigned int c;
unsigned int num = 0;
unsigned char *p = *buffer;

printf("nnDeCompressionn===============n");

do{
c = ((unsigned char) *p++);
printf("Read=%dn", c);
if (c <= 0) {
printf("Error: c is < 0 in uncompress1()n");
exit(0);
}
num <<= 7;
num |= c & 127;

printf("uncompress: c = %d num = %dn", c, num);

if (!num)
break;
}while (c & 128);

*buffer = p;

printf("Returning %dn", num);

return num;
}


unsigned char *MyCompress(unsigned int num, unsigned char *buffer){
int i = 0;
unsigned int r = num;
unsigned char temp;
unsigned char s[5];

printf("Compressionn===============n");

printf("received %d to compressn", num);

if(!r){
*buffer++ = 0;
return buffer;
}

while (r){
s[i] = r & 127;
r >>= 7;
printf("s[%d]=%d; r=%dn", i, s[i], r);
i++;
}

while (--i >= 0){
temp = (unsigned char)(s[i] | (i ? 128 : 0));
printf("temp=%dn", temp);
*buffer++=temp;
}
return buffer;
}

//Salida:

Compression
===============
received 25960 to compress
s[0]=104; r=202
s[1]=74; r=1
s[2]=1; r=0
temp=129
temp=202
temp=104
Compression
===============
received 385 to compress
s[0]=1; r=3
s[1]=3; r=0
temp=131
temp=1
Compression
===============
received 900 to compress
s[0]=4; r=7
s[1]=7; r=0
temp=135
temp=4
Compression
===============
received 20560 to compress
s[0]=80; r=160
s[1]=32; r=1
s[2]=1; r=0
temp=129
temp=160
temp=80
Compression
===============
received 384 to compress
s[0]=0; r=3
s[1]=3; r=0
temp=131
temp=0


DeCompression
===============
Read=129
uncompress: c = 129 num = 1
Read=202
uncompress: c = 202 num = 202
Read=104
uncompress: c = 104 num = 25960
Returning 25960


DeCompression
===============
Read=131
uncompress: c = 131 num = 3
Read=1
uncompress: c = 1 num = 385
Returning 385


DeCompression
===============
Read=135
uncompress: c = 135 num = 7
Read=4
uncompress: c = 4 num = 900
Returning 900


DeCompression
===============
Read=129
uncompress: c = 129 num = 1
Read=160
uncompress: c = 160 num = 160
Read=80
uncompress: c = 80 num = 20560
Returning 20560


DeCompression
===============
Read=131
uncompress: c = 131 num = 3
Read=0
Error: c is < 0 in uncompress1()

¿Por qué me aparece el error: cuando el número DeCompress 384?

Respuestas

0 para la respuesta № 1

Ya hiciste esta pregunta, y yo ya la respondí. aquí. Cero es un byte esperado en su esquema de codificación, y no debe ser rechazado. Simplemente elimine el if (c <= 0) sección.