亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? zdeflate.cpp

?? 加密函數庫:包括多種加密解密算法,數字簽名,散列算法
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
// zdeflate.cpp - written and placed in the public domain by Wei Dai

// Many of the algorithms and tables used here came from the deflate implementation
// by Jean-loup Gailly, which was included in Crypto++ 4.0 and earlier. I completely
// rewrote it in order to fix a bug that I could not figure out. This code
// is less clever, but hopefully more understandable and maintainable.

#include "pch.h"
#include "zdeflate.h"
#include <functional>

NAMESPACE_BEGIN(CryptoPP)

using namespace std;

LowFirstBitWriter::LowFirstBitWriter(BufferedTransformation *attachment)
	: Filter(attachment), m_counting(false), m_buffer(0), m_bitsBuffered(0), m_bytesBuffered(0)
{
}

void LowFirstBitWriter::StartCounting()
{
	assert(!m_counting);
	m_counting = true;
	m_bitCount = 0;
}

unsigned long LowFirstBitWriter::FinishCounting()
{
	assert(m_counting);
	m_counting = false;
	return m_bitCount;
}

void LowFirstBitWriter::PutBits(unsigned long value, unsigned int length)
{
	if (m_counting)
		m_bitCount += length;
	else
	{
		m_buffer |= value << m_bitsBuffered;
		m_bitsBuffered += length;
		assert(m_bitsBuffered <= sizeof(unsigned long)*8);
		while (m_bitsBuffered >= 8)
		{
			m_outputBuffer[m_bytesBuffered++] = (byte)m_buffer;
			if (m_bytesBuffered == m_outputBuffer.size())
			{
				AttachedTransformation()->PutModifiable(m_outputBuffer, m_bytesBuffered);
				m_bytesBuffered = 0;
			}
			m_buffer >>= 8;
			m_bitsBuffered -= 8;
		}
	}
}

void LowFirstBitWriter::FlushBitBuffer()
{
	if (m_counting)
		m_bitCount += 8*(m_bitsBuffered > 0);
	else
	{
		if (m_bytesBuffered > 0)
		{
			AttachedTransformation()->PutModifiable(m_outputBuffer, m_bytesBuffered);
			m_bytesBuffered = 0;
		}
		if (m_bitsBuffered > 0)
		{
			AttachedTransformation()->Put((byte)m_buffer);
			m_buffer = 0;
			m_bitsBuffered = 0;
		}
	}
}

void LowFirstBitWriter::ClearBitBuffer()
{
	m_buffer = 0;
	m_bytesBuffered = 0;
	m_bitsBuffered = 0;
}

HuffmanEncoder::HuffmanEncoder(const unsigned int *codeBits, unsigned int nCodes)
{
	Initialize(codeBits, nCodes);
}

struct HuffmanNode
{
	unsigned int symbol;
	union {unsigned int parent, depth, freq;};
};

struct FreqLessThan
{
	inline bool operator()(unsigned int lhs, const HuffmanNode &rhs) {return lhs < rhs.freq;}
	inline bool operator()(const HuffmanNode &lhs, const HuffmanNode &rhs) const {return lhs.freq < rhs.freq;}
};

void HuffmanEncoder::GenerateCodeLengths(unsigned int *codeBits, unsigned int maxCodeBits, const unsigned int *codeCounts, unsigned int nCodes)
{
	assert(nCodes > 0);
	assert(nCodes <= (unsigned int)(1 << maxCodeBits));

	unsigned int i;
	SecBlockWithHint<HuffmanNode, 2*286> tree(nCodes);
	for (i=0; i<nCodes; i++)
	{
		tree[i].symbol = i;
		tree[i].freq = codeCounts[i];
	}
	sort(tree.begin(), tree.end(), FreqLessThan());
	unsigned int treeBegin = upper_bound(tree.begin(), tree.end(), 0, FreqLessThan()) - tree.begin();
	if (treeBegin == nCodes)
	{	// special case for no codes
		fill(codeBits, codeBits+nCodes, 0);
		return;
	}
	tree.resize(nCodes + nCodes - treeBegin - 1);

	unsigned int leastLeaf = treeBegin, leastInterior = nCodes;
	for (i=nCodes; i<tree.size(); i++)
	{
		unsigned int least;
		least = (leastLeaf == nCodes || (leastInterior < i && tree[leastInterior].freq < tree[leastLeaf].freq)) ? leastInterior++ : leastLeaf++;
		tree[i].freq = tree[least].freq;
		tree[least].parent = i;
		least = (leastLeaf == nCodes || (leastInterior < i && tree[leastInterior].freq < tree[leastLeaf].freq)) ? leastInterior++ : leastLeaf++;
		tree[i].freq += tree[least].freq;
		tree[least].parent = i;
	}

	tree[tree.size()-1].depth = 0;
	if (tree.size() >= 2)
		for (i=tree.size()-2; i>=nCodes; i--)
			tree[i].depth = tree[tree[i].parent].depth + 1;
	unsigned int sum = 0;
	SecBlockWithHint<unsigned int, 15+1> blCount(maxCodeBits+1);
	fill(blCount.begin(), blCount.end(), 0);
	for (i=treeBegin; i<nCodes; i++)
	{
		unsigned int depth = STDMIN(maxCodeBits, tree[tree[i].parent].depth + 1);
		blCount[depth]++;
		sum += 1 << (maxCodeBits - depth);
	}

	unsigned int overflow = sum > (unsigned int)(1 << maxCodeBits) ? sum - (1 << maxCodeBits) : 0;

	while (overflow--)
	{
		unsigned int bits = maxCodeBits-1;
		while (blCount[bits] == 0)
			bits--;
		blCount[bits]--;
		blCount[bits+1] += 2;
		assert(blCount[maxCodeBits] > 0);
		blCount[maxCodeBits]--;
	}

	for (i=0; i<treeBegin; i++)
		codeBits[tree[i].symbol] = 0;
	unsigned int bits = maxCodeBits;
	for (i=treeBegin; i<nCodes; i++)
	{
		while (blCount[bits] == 0)
			bits--;
		codeBits[tree[i].symbol] = bits;
		blCount[bits]--;
	}
	assert(blCount[bits] == 0);
}

void HuffmanEncoder::Initialize(const unsigned int *codeBits, unsigned int nCodes)
{
	assert(nCodes > 0);
	unsigned int maxCodeBits = *max_element(codeBits, codeBits+nCodes);
	if (maxCodeBits == 0)
		return;		// assume this object won't be used

	SecBlockWithHint<unsigned int, 15+1> blCount(maxCodeBits+1);
	fill(blCount.begin(), blCount.end(), 0);
	unsigned int i;
	for (i=0; i<nCodes; i++)
		blCount[codeBits[i]]++;

	code_t code = 0;
	SecBlockWithHint<code_t, 15+1> nextCode(maxCodeBits+1);
	nextCode[1] = 0;
	for (i=2; i<=maxCodeBits; i++)
	{
		code = (code + blCount[i-1]) << 1;
		nextCode[i] = code;
	}
	assert(maxCodeBits == 1 || code == (1 << maxCodeBits) - blCount[maxCodeBits]);

	m_valueToCode.resize(nCodes);
	for (i=0; i<nCodes; i++)
	{
		unsigned int len = m_valueToCode[i].len = codeBits[i];
		if (len != 0)
			m_valueToCode[i].code = BitReverse(nextCode[len]++) >> (8*sizeof(code_t)-len);
	}
}

inline void HuffmanEncoder::Encode(LowFirstBitWriter &writer, value_t value) const
{
	assert(m_valueToCode[value].len > 0);
	writer.PutBits(m_valueToCode[value].code, m_valueToCode[value].len);
}

Deflator::Deflator(BufferedTransformation *attachment, int deflateLevel, int log2WindowSize)
	: LowFirstBitWriter(attachment)
{
	InitializeStaticEncoders();
	IsolatedInitialize(MakeParameters("DeflateLevel", deflateLevel)("Log2WindowSize", log2WindowSize));
}

Deflator::Deflator(const NameValuePairs &parameters, BufferedTransformation *attachment)
	: LowFirstBitWriter(attachment)
{
	InitializeStaticEncoders();
	IsolatedInitialize(parameters);
}

void Deflator::InitializeStaticEncoders()
{
	unsigned int codeLengths[288];
	fill(codeLengths + 0, codeLengths + 144, 8);
	fill(codeLengths + 144, codeLengths + 256, 9);
	fill(codeLengths + 256, codeLengths + 280, 7);
	fill(codeLengths + 280, codeLengths + 288, 8);
	m_staticLiteralEncoder.Initialize(codeLengths, 288);
	fill(codeLengths + 0, codeLengths + 32, 5);
	m_staticDistanceEncoder.Initialize(codeLengths, 32);
}

void Deflator::IsolatedInitialize(const NameValuePairs &parameters)
{
	int log2WindowSize = parameters.GetIntValueWithDefault("Log2WindowSize", DEFAULT_LOG2_WINDOW_SIZE);

	if (!(MIN_LOG2_WINDOW_SIZE <= log2WindowSize && log2WindowSize <= MAX_LOG2_WINDOW_SIZE))
		throw InvalidArgument("Deflator: " + IntToString(log2WindowSize) + " is an invalid window size");

	m_log2WindowSize = log2WindowSize;
	DSIZE = 1 << m_log2WindowSize;
	DMASK = DSIZE - 1;
	HSIZE = 1 << m_log2WindowSize;
	HMASK = HSIZE - 1;
	m_byteBuffer.New(2*DSIZE);
	m_head.New(HSIZE);
	m_prev.New(DSIZE);
	m_matchBuffer.New(DSIZE/2);

	SetDeflateLevel(parameters.GetIntValueWithDefault("DeflateLevel", DEFAULT_DEFLATE_LEVEL));
	Reset(true);
}

void Deflator::Reset(bool forceReset)
{
	if (forceReset)
		ClearBitBuffer();
	else
		assert(m_bitsBuffered == 0);

	m_headerWritten = false;
	m_matchAvailable = false;
	m_dictionaryEnd = 0;
	m_stringStart = 0;
	m_lookahead = 0;
	m_minLookahead = MAX_MATCH;
	m_previousMatch = 0;
	m_previousLength = 0;
	m_matchBufferEnd = 0;
	m_blockStart = 0;
	m_blockLength = 0;

	// m_prev will be initialized automaticly in InsertString
	fill(m_head.begin(), m_head.end(), 0);

	fill(m_literalCounts.begin(), m_literalCounts.end(), 0);
	fill(m_distanceCounts.begin(), m_distanceCounts.end(), 0);
}

void Deflator::SetDeflateLevel(int deflateLevel)
{
	if (!(MIN_DEFLATE_LEVEL <= deflateLevel && deflateLevel <= MAX_DEFLATE_LEVEL))
		throw InvalidArgument("Deflator: " + IntToString(deflateLevel) + " is an invalid deflate level");

	unsigned int configurationTable[10][4] = {
		/*      good lazy nice chain */
		/* 0 */ {0,    0,  0,    0},  /* store only */
		/* 1 */ {4,    3,  8,    4},  /* maximum speed, no lazy matches */
		/* 2 */ {4,    3, 16,    8},
		/* 3 */ {4,    3, 32,   32},
		/* 4 */ {4,    4, 16,   16},  /* lazy matches */
		/* 5 */ {8,   16, 32,   32},
		/* 6 */ {8,   16, 128, 128},
		/* 7 */ {8,   32, 128, 256},
		/* 8 */ {32, 128, 258, 1024},
		/* 9 */ {32, 258, 258, 4096}}; /* maximum compression */

	GOOD_MATCH = configurationTable[deflateLevel][0];
	MAX_LAZYLENGTH = configurationTable[deflateLevel][1];
	MAX_CHAIN_LENGTH = configurationTable[deflateLevel][3];

	m_deflateLevel = deflateLevel;
}

unsigned int Deflator::FillWindow(const byte *str, unsigned int length)
{
	unsigned int accepted = STDMIN(length, 2*DSIZE-(m_stringStart+m_lookahead));

	if (m_stringStart >= 2*DSIZE - MAX_MATCH)
	{
		if (m_blockStart < DSIZE)
			EndBlock(false);

		memcpy(m_byteBuffer, m_byteBuffer + DSIZE, DSIZE);

		m_dictionaryEnd = m_dictionaryEnd < DSIZE ? 0 : m_dictionaryEnd-DSIZE;
		assert(m_stringStart >= DSIZE);
		m_stringStart -= DSIZE;
		assert(m_previousMatch >= DSIZE || m_previousLength < MIN_MATCH);
		m_previousMatch -= DSIZE;
		assert(m_blockStart >= DSIZE);
		m_blockStart -= DSIZE;

		unsigned int i;

		for (i=0; i<HSIZE; i++)
			m_head[i] = SaturatingSubtract(m_head[i], DSIZE);

		for (i=0; i<DSIZE; i++)
			m_prev[i] = SaturatingSubtract(m_prev[i], DSIZE);

		accepted = STDMIN(accepted + DSIZE, length);
	}
	assert(accepted > 0);

	memcpy(m_byteBuffer + m_stringStart + m_lookahead, str, accepted);
	m_lookahead += accepted;
	return accepted;
}

inline unsigned int Deflator::ComputeHash(const byte *str) const
{
	assert(str+3 <= m_byteBuffer + m_stringStart + m_lookahead);
	return ((str[0] << 10) ^ (str[1] << 5) ^ str[2]) & HMASK;
}

unsigned int Deflator::LongestMatch(unsigned int &bestMatch) const
{
	assert(m_previousLength < MAX_MATCH);

	bestMatch = 0;
	unsigned int bestLength = STDMAX(m_previousLength, (unsigned int)MIN_MATCH-1);
	if (m_lookahead <= bestLength)
		return 0;

	const byte *scan = m_byteBuffer + m_stringStart, *scanEnd = scan + STDMIN((unsigned int)MAX_MATCH, m_lookahead);
	unsigned int limit = m_stringStart > (DSIZE-MAX_MATCH) ? m_stringStart - (DSIZE-MAX_MATCH) : 0;
	unsigned int current = m_head[ComputeHash(scan)];

	unsigned int chainLength = MAX_CHAIN_LENGTH;
	if (m_previousLength >= GOOD_MATCH)
		chainLength >>= 2;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品每日更新在线播放网址| 亚洲国产乱码最新视频| 亚洲综合视频网| 国产成人精品网址| 欧美三级日本三级少妇99| 国产精品三级久久久久三级| 日韩高清一区二区| 一本色道**综合亚洲精品蜜桃冫| 26uuu亚洲综合色| 免费人成网站在线观看欧美高清| 在线日韩av片| 亚洲欧美另类久久久精品2019| 捆绑调教一区二区三区| 精品视频色一区| 亚洲精品久久久久久国产精华液| 国产盗摄精品一区二区三区在线| 日韩欧美在线影院| 午夜视频一区在线观看| 欧美偷拍一区二区| 一区二区高清在线| 91色视频在线| 亚洲男人电影天堂| 91年精品国产| 亚洲精品国产一区二区精华液 | 一区二区三区在线免费播放| 国产高清不卡一区二区| 欧美精品一区二区三区蜜桃视频| 日本成人在线看| 4438x亚洲最大成人网| 亚洲精品va在线观看| 一本大道久久精品懂色aⅴ| 国产精品国产三级国产a| 成人白浆超碰人人人人| 国产精品久久久久一区二区三区 | 久久久国际精品| 成人黄色片在线观看| 日本一区二区三区视频视频| 国产精品一级黄| 国产精品视频一二三区| av一二三不卡影片| 亚洲伦理在线精品| 精品视频免费看| 青青草国产成人99久久| 精品国产欧美一区二区| 国产成人午夜高潮毛片| 国产精品家庭影院| 一道本成人在线| 七七婷婷婷婷精品国产| 欧美精品一区二区三区一线天视频| 狠狠久久亚洲欧美| 欧美韩日一区二区三区四区| 91丝袜国产在线播放| 亚洲一区在线观看免费| 欧美精品色综合| 国产做a爰片久久毛片| 国产精品亲子乱子伦xxxx裸| 色伊人久久综合中文字幕| 亚洲午夜精品网| 欧美mv日韩mv亚洲| 99re成人精品视频| 五月天中文字幕一区二区| 精品国产乱码久久久久久浪潮| 成人动漫一区二区三区| 日韩精品午夜视频| 天天免费综合色| 国产视频一区在线观看| 色视频欧美一区二区三区| 亚洲aⅴ怡春院| 国产精品天天看| 欧美又粗又大又爽| 国产综合一区二区| 一区二区三区av电影| 久久综合成人精品亚洲另类欧美 | 欧美挠脚心视频网站| 韩国在线一区二区| 亚洲一区在线观看视频| 国产日韩精品久久久| 欧美二区在线观看| caoporn国产精品| 日韩av不卡一区二区| 欧美激情在线看| 精品少妇一区二区| 91九色最新地址| 成人性色生活片| 久久精品国产亚洲一区二区三区| 中文字幕日韩一区| 久久亚洲综合色一区二区三区| 91国产丝袜在线播放| 国产盗摄女厕一区二区三区| 日本亚洲一区二区| 亚洲精品日日夜夜| 国产精品女同互慰在线看| 欧美成人精品福利| 欧美日韩视频在线第一区| 波多野结衣中文字幕一区| 精一区二区三区| 丝袜美腿高跟呻吟高潮一区| 亚洲美女偷拍久久| 国产精品麻豆一区二区| 欧美成人艳星乳罩| 日韩欧美一级二级三级久久久| 日本韩国视频一区二区| 成人av在线一区二区| 国产美女久久久久| 精品一区二区精品| 奇米影视一区二区三区小说| 亚洲小少妇裸体bbw| 亚洲精品久久嫩草网站秘色| 亚洲天堂成人网| 国产精品热久久久久夜色精品三区 | 午夜视频在线观看一区| 夜夜亚洲天天久久| 夜夜嗨av一区二区三区四季av| 国产精品免费看片| 国产精品久久久久久久第一福利| 亚洲国产成人在线| 欧美极品aⅴ影院| 中文字幕在线观看不卡视频| 国产精品狼人久久影院观看方式| 久久精品人人爽人人爽| 国产日韩欧美制服另类| 国产女人水真多18毛片18精品视频| 久久精品一区蜜桃臀影院| 国产午夜精品久久久久久免费视| 精品免费视频.| 亚洲国产成人午夜在线一区| 国产精品三级视频| 亚洲精品老司机| 日本美女一区二区三区视频| 九色综合国产一区二区三区| 国产乱妇无码大片在线观看| 成人av在线播放网站| 色婷婷综合中文久久一本| 欧美中文字幕一区二区三区亚洲| 欧美军同video69gay| 欧美一区二区网站| 国产清纯美女被跳蛋高潮一区二区久久w | 美国十次综合导航| 国产美女久久久久| 91视频在线观看免费| 欧美羞羞免费网站| 日韩女优电影在线观看| 国产欧美日韩在线视频| 一区2区3区在线看| 经典三级一区二区| 色婷婷亚洲精品| 欧美一级日韩免费不卡| 久久精品视频一区| 亚洲一区二区欧美激情| 国产一区二区三区免费播放| 91蜜桃传媒精品久久久一区二区| 欧美日韩不卡一区| 国产精品少妇自拍| 天天色天天爱天天射综合| 成人小视频在线| 欧美一区二区三区在线看| 国产日韩欧美一区二区三区综合| 亚洲一区二区三区小说| 国产一区二区三区精品欧美日韩一区二区三区 | 欧美日韩精品一区二区| 国产天堂亚洲国产碰碰| 午夜伊人狠狠久久| www.久久久久久久久| 欧美一区二区性放荡片| 中文字幕日本不卡| 国产原创一区二区三区| 在线免费亚洲电影| 日本一区二区综合亚洲| 裸体一区二区三区| 91麻豆蜜桃一区二区三区| 久久影院电视剧免费观看| 亚洲午夜久久久久久久久电影院| 国产成人精品一区二| 日韩午夜精品视频| 亚洲成人av资源| 91久久一区二区| 中文字幕成人在线观看| 国内精品伊人久久久久av影院 | 色婷婷久久综合| 欧美高清在线精品一区| 国产在线视频一区二区| 555www色欧美视频| 亚洲国产精品久久久久秋霞影院| 丁香激情综合五月| wwwwww.欧美系列| 日本午夜精品一区二区三区电影| 色狠狠色噜噜噜综合网| 欧美国产精品中文字幕| 国产在线国偷精品免费看| 欧美一区二区三区在| 午夜视频在线观看一区二区| 在线免费不卡电影| 一区二区三区蜜桃网| 一本一道久久a久久精品综合蜜臀| 久久久精品tv| 国产乱码精品1区2区3区| 精品国产99国产精品| 免费一级欧美片在线观看| 欧美一区二区视频网站| 日韩精品一二三|