/* * Compress3.cpp * Copyright 1999-2000 Y.Takagi. All Rights Reserved. */ //#define DBG_CON_STREAM #ifdef DBG_CON_STREAM #include using namespace std; #endif #include "Compress3.h" #define PACK_TYPE 2 int compress3(unsigned char *pOut, unsigned char *pIn, int n) { int count; int count_byte; unsigned char *pBase; unsigned char *pLast; unsigned char keep; count = 0; count_byte = 0; keep = ~(*pIn); pLast = pIn + n; for (pBase = pIn; (pBase < pLast) && (count_byte < n) ; pBase++) { if (*pBase == keep) { if (count < 0xff + PACK_TYPE) { count++; } else { *pOut++ = keep; *pOut++ = count - PACK_TYPE; count = 1; keep = *pOut++ = *pBase; count_byte += 3; } } else { if (count > 1) { *pOut++ = keep; *pOut++ = count - PACK_TYPE; count_byte += 2; } count = 1; keep = *pOut++ = *pBase; count_byte++; } } if (count > 1) { if ((count_byte + 2) < n) { *pOut++ = keep; *pOut++ = count - PACK_TYPE; count_byte += 2; } else { count_byte = n; } } return count_byte; } #ifdef DBG_CON_STREAM int main(int argc, char **argv) { if (argc < 2) { return -1; } ifstream ifs(*++argv, ios::binary | ios::nocreate); if (!ifs) { return -1; } ifs.seekg(0, ios::end); long size = ifs.tellg(); ifs.seekg(0, ios::beg); unsigned char *pIn = new unsigned char[size]; unsigned char *pOut = new unsigned char[size * 3]; ifs.read(pIn, size); int cnt = PackBits(pOut, pIn, size); ofstream ofs("test.bin", ios::binary); ofs.write(pOut, cnt); delete [] pIn; delete [] pOut; } #endif