#include <stdio.h>
|
#include <stdio.h>
|
|
|
unsigned char src[5000000];
|
unsigned char src[5000000];
|
unsigned char dest[10000000];
|
unsigned char dest[10000000];
|
unsigned char dec[10000000];
|
unsigned char dec[10000000];
|
|
|
#define CRC(x) (crc = (crc << 5) | (x))
|
#define CRC(x) (crc = (crc << 5) | (x))
|
|
|
unsigned long compress (unsigned char *in, unsigned char *out, unsigned long size)
|
unsigned long compress (unsigned char *in, unsigned char *out, unsigned long size)
|
{
|
{
|
unsigned char hist[0x10000] = {0};
|
unsigned char hist[0x10000] = {0};
|
unsigned char *mask;
|
unsigned char *mask;
|
unsigned short hash = 0;
|
unsigned short hash = 0;
|
unsigned i, b;
|
unsigned i, b;
|
unsigned long csize = 5;
|
unsigned long csize = 5;
|
unsigned long crc = 0;
|
unsigned long crc = 0;
|
|
|
*out++ = (size >> 24) & 0xff;
|
*out++ = (size >> 24) & 0xff;
|
*out++ = (size >> 16) & 0xff;
|
*out++ = (size >> 16) & 0xff;
|
*out++ = (size >> 8) & 0xff;
|
*out++ = (size >> 8) & 0xff;
|
*out++ = (size >> 0) & 0xff;
|
*out++ = (size >> 0) & 0xff;
|
mask = out++;
|
mask = out++;
|
*mask = 0;
|
*mask = 0;
|
for (i = 0, b = 0; i < size; i++) {
|
for (i = 0, b = 0; i < size; i++) {
|
CRC(*in);
|
CRC(*in);
|
if (*in == hist[hash]) *mask |= 1 << b;
|
if (*in == hist[hash]) *mask |= 1 << b;
|
else {
|
else {
|
*out++ = *in;
|
*out++ = *in;
|
csize++;
|
csize++;
|
}
|
}
|
hist[hash] = *in;
|
hist[hash] = *in;
|
hash <<= 8;
|
hash <<= 8;
|
hash |= *in;
|
hash |= *in;
|
if (++b == 8) {
|
if (++b == 8) {
|
mask = out++;
|
mask = out++;
|
csize++;
|
csize++;
|
*mask = 0;
|
*mask = 0;
|
b = 0;
|
b = 0;
|
}
|
}
|
in++;
|
in++;
|
}
|
}
|
printf ("original CRC = %08x\n", crc);
|
printf ("original CRC = %08x\n", crc);
|
return csize;
|
return csize;
|
}
|
}
|
|
|
unsigned long decompress (unsigned char *in, unsigned char *out)
|
unsigned long decompress (unsigned char *in, unsigned char *out)
|
{
|
{
|
unsigned char hist[0x10000] = {0};
|
unsigned char hist[0x10000] = {0};
|
unsigned long size;
|
unsigned long size;
|
int b = 0, i;
|
int b = 0, i;
|
unsigned char *mask;
|
unsigned char *mask;
|
unsigned short hash = 0;
|
unsigned short hash = 0;
|
unsigned long crc = 0;
|
unsigned long crc = 0;
|
|
|
CRC(*in); size = (*in++) << 24;
|
CRC(*in); size = (*in++) << 24;
|
CRC(*in); size |= (*in++) << 16;
|
CRC(*in); size |= (*in++) << 16;
|
CRC(*in); size |= (*in++) << 8;
|
CRC(*in); size |= (*in++) << 8;
|
CRC(*in); size |= (*in++) << 0;
|
CRC(*in); size |= (*in++) << 0;
|
CRC(*in); mask = in++;
|
CRC(*in); mask = in++;
|
for (i = 0; i < size; i++) {
|
for (i = 0; i < size; i++) {
|
unsigned char c;
|
unsigned char c;
|
if ((*mask >> b) & 1) c = hist[hash];
|
if ((*mask >> b) & 1) c = hist[hash];
|
else CRC(c = *in++);
|
else CRC(c = *in++);
|
*out++ = c;
|
*out++ = c;
|
hist[hash] = c;
|
hist[hash] = c;
|
hash <<= 8;
|
hash <<= 8;
|
hash |= c;
|
hash |= c;
|
hash &= 0xffff;
|
hash &= 0xffff;
|
if (++b == 8) {
|
if (++b == 8) {
|
CRC(*in);
|
CRC(*in);
|
mask = in++;
|
mask = in++;
|
b = 0;
|
b = 0;
|
}
|
}
|
}
|
}
|
printf ("compressed CRC = %08x\n", crc);
|
printf ("compressed CRC = %08x\n", crc);
|
return size;
|
return size;
|
}
|
}
|
|
|
int main (int argc, char *argv[])
|
int main (int argc, char *argv[])
|
{
|
{
|
FILE *fi;
|
FILE *fi;
|
unsigned short hash = 0;
|
unsigned short hash = 0;
|
int i, size;
|
int i, size;
|
char tmp[50];
|
char tmp[50];
|
unsigned long crc = 0;
|
unsigned long crc = 0;
|
if (argc != 2) return -1;
|
if (argc != 2) return -1;
|
|
|
fi = fopen (argv[1], "rb");
|
fi = fopen (argv[1], "rb");
|
if (!fi) return 1;
|
if (!fi) return 1;
|
size = fread (src, 1, sizeof (src), fi);
|
size = fread (src, 1, sizeof (src), fi);
|
fclose (fi);
|
fclose (fi);
|
printf ("original size = %i (%08x)\n", size, size);
|
printf ("original size = %i (%08x)\n", size, size);
|
size = compress (src, dest, size);
|
size = compress (src, dest, size);
|
printf ("compressed size = %i (%08x)\n", size, size);
|
printf ("compressed size = %i (%08x)\n", size, size);
|
sprintf (tmp, "%s.cmp", argv[1]);
|
sprintf (tmp, "%s.cmp", argv[1]);
|
fi = fopen (tmp, "wb+");
|
fi = fopen (tmp, "wb+");
|
fwrite (dest, 1, size, fi);
|
fwrite (dest, 1, size, fi);
|
fclose (fi);
|
fclose (fi);
|
size = decompress (dest, dec);
|
size = decompress (dest, dec);
|
printf ("decompressed size = %i (%08x)\n", size, size);
|
printf ("decompressed size = %i (%08x)\n", size, size);
|
for (i = 0; i < size; i++)
|
for (i = 0; i < size; i++)
|
if (src[i] != dec[i]) {
|
if (src[i] != dec[i]) {
|
printf ("error!\n");
|
printf ("error!\n");
|
return 1;
|
return 1;
|
}
|
}
|
#if 0
|
#if 0
|
fi = fopen ("fl_img.dec", "wb+");
|
fi = fopen ("fl_img.dec", "wb+");
|
fwrite (dec, 1, size, fi);
|
fwrite (dec, 1, size, fi);
|
fclose (fi);
|
fclose (fi);
|
#endif
|
#endif
|
return 0;
|
return 0;
|
}
|
}
|
|
|