Ejemplo n.º 1
0
void deflate_dynamic(OutBuffer &buf, vector<Symb> &lz77Coded, vector<int> &litLens, vector<int> &dstLens) {
	short BTYPE = 2;
	buf.writebits(BTYPE, 2, true);

	int HLIT = Hcount(litLens, 257);
	int HDIST = Hcount(dstLens, 1);

	vector<Symb> HCcoded = HC_encode(HLIT, HDIST, litLens, dstLens);

	vector<int> hcProbs(19, 0);
	for (int i = 0; i < HCcoded.size(); i++)
		hcProbs[HCcoded[i].lit]++;

	vector<int> hcLens(19);
	Huffman_builder(hcProbs, hcLens);
	vector<int> hcCodes = get_codes(hcLens, 8);

	int HCLEN = 4;
	for (int i = 4; i < hcLens.size(); i++)
		if (hcLens[hcOrder[i]]) HCLEN = i + 1;

	buf.writebits(HLIT - 257, 5, true);
	buf.writebits(HDIST - 1, 5, true);
	buf.writebits(HCLEN - 4, 4, true);

	print_hc_encoded(buf, HCLEN, hcCodes, hcLens, HCcoded);

	int maxLen = 20;
	vector<int> litCodes = get_codes(litLens, maxLen);
	vector<int> dstCodes = get_codes(dstLens, maxLen);
	print_encoded(buf, lz77Coded, litCodes, litLens, dstCodes, dstLens);
}
Ejemplo n.º 2
0
void print_encoded(OutBuffer &buf, vector<Symb> coded, vector<int> litCodes, vector<int> litLens, vector<int> dstCodes, vector<int> dstLens) {
	for (int i = 0; i < coded.size(); i++) {
		Symb cur = coded[i];
		vector<int> &code = (cur.isLit) ? litCodes : dstCodes;
		vector<int> &len = (cur.isLit) ? litLens : dstLens;

		buf.writebits(code[cur.lit], len[cur.lit], false);
		buf.writebits(cur.add, cur.addLen, true);
	}
}
Ejemplo n.º 3
0
void print_hc_encoded(OutBuffer &buf, int HCLEN, vector<int> hcCodes, vector<int> hcLens, vector<Symb> coded) {
	for (int i = 0; i < HCLEN; i++)
		buf.writebits(hcLens[hcOrder[i]], 3, true);

	for (int i = 0; i < coded.size(); i++) {
		Symb cur = coded[i];

		buf.writebits(hcCodes[cur.lit], hcLens[cur.lit], false);
		buf.writebits(cur.add, cur.addLen, true);
	}
}
Ejemplo n.º 4
0
void deflate_stored(OutBuffer &buf, vector<unsigned char> &charList) {
	short BTYPE = 0;
	buf.writebits(BTYPE, 2, true);
	buf.writebits(0, 5, true); //stored bytes should start from byte bound

	short LEN = charList.size();
	buf.writebits(LEN, 16, true);
	buf.writebits(~LEN, 16, true);

	for (int i = 0; i < LEN; ++i)
		buf.writebits(charList[i], 8, true);
}
Ejemplo n.º 5
0
void deflate_fixed(OutBuffer &buf, vector<Symb> &lz77Coded, vector<int> litLens, vector<int> dstLens) {
	short BTYPE = 1;
	buf.writebits(BTYPE, 2, true);

	int maxLen = 20;
	vector<int> litCodes = get_codes(litLens, maxLen);
	vector<int> dstCodes = get_codes(dstLens, maxLen);
	print_encoded(buf, lz77Coded, litCodes, litLens, dstCodes, dstLens);
}