예제 #1
0
int main(int argc, char ** argv) {

  if(argc!=4) {
    cout << "Checks the array class generating <length> elements between 0 and <maxv> using <seed> as seed for the numbers generation" << endl << endl;
    cout << "usage: " << argv[0] << " <seed> <length> <maxv>" << endl;
    return 0;
  }

  srand(transform(string(argv[1])));
  uint len = transform(string(argv[2]));
  uint maxv = transform(string(argv[3]));

  //cout << "maxv = " << maxv << endl;
  //cout << "len  = " << len << endl;

  Array a(len,maxv);
  for(uint i=0;i<len;i++) {
    a.setField(i,rand()%maxv);
    cout << "s[" << i << "]=" << a[i] << endl;
  }
  
  HuffmanCoder * hc = new HuffmanCoder(a);
  cout << "Max length: " << hc->maxLength() << endl;

  for(size_t i=0;i<len;i++) {
      size_t ptr = 0;
      uint stream[10];
      cout << "coding " << a[i] << ": ";
      ptr = hc->encode(a[i],stream,ptr);
      for(size_t k=0;k<ptr;k++)
          cout << bitget(stream,k);
      cout << endl;
  }
  return 0;
}
예제 #2
0
int _tmain(int argc, _TCHAR* argv[])
{
	HuffmanCoder H;

	//string lorem = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \
				   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \
				   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \
				   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \
				   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \
				   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \
				   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \
				   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \
				   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \
				   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \
				   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \
				   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \
				   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \
				   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \
				   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \
				   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \
				   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \
				   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \
				   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
	//string lorem = "Lorem ipsum dolor sit amet, \
				   consectetur adipiscing elit. \
				   Videamus animi partes, \
				   quarum est conspectus illustrior; \
				   Quae cum essent dicta, \
				   finem fecimus et ambulandi et disputandi. \
				   Ad corpus diceres pertinere, \
				   sed ea, quae dixi, ad corpusne refers? \
				   Duo Reges: constructio interrete. \
				   Expectoque quid ad id, \
				   quod quaerebam, respondeas. \
				   Nunc ita separantur, ut disiuncta sint, \
				   quo nihil potest esse perversius. \
				   At miser, si in flagitiosa et \
				   vitiosa vita afflueret voluptatibus.";
	string lorem;
	ifstream myfile("C:\\Users\\Sam\\Desktop\\Compressor\\Genesis.txt");
	for(int i = 0; myfile && i<16000; i++)
	{
		lorem += myfile.get();
	}
	myfile.close();
	cout << "read" << endl;

	string coded = H.encode(lorem);
	cout << lorem.length()*8 << "->" << coded.length() << endl;

	PAUSE
	return 0;
}
예제 #3
0
void EncodeBuffer::encodeCachedValue(unsigned int value,
                                     unsigned int numBits,
                                     PixelCache & cache,
                                     HuffmanCoder & escapeCoder0,
                                     HuffmanCoder & escapeCoder1)
{
    unsigned int index;

    DBG("encodePixelCache.\n");

    if (cache.lookup(value, index))
    {
        encodeIndex(index);
    }
    else
    {
        encodeEscapeIndex();
        // To transmit the value, use run-length coding with the static
        // Huffman code implemented by the supplied "escapeCoder" object
        //X encodeValue(value, numBits, numBits);
        unsigned int srcMask = 0x1;
        unsigned int pixelValue = ((value & srcMask) ? 1 : 0);

        encodeDirect(pixelValue, 1);
        for (unsigned int x = 0; x < numBits;)
        {
            unsigned int runStart = x;

            if (pixelValue)
            {
                while (x < numBits)
                {
                    if (!(value & srcMask))
                        break;
                    srcMask <<= 1;
                    x++;
                }
            }
            else
            {
                while (x < numBits)
                {
                    if (value & srcMask)
                        break;
                    srcMask <<= 1;
                    x++;
                }
            }
            unsigned int runLength = x - runStart;

            if (pixelValue)
            {
                escapeCoder1.encode(runLength - 1, *this);
                pixelValue = 0;
            }
            else
            {
                escapeCoder0.encode(runLength - 1, *this);
                pixelValue = 1;
            }
        }
    }
}