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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? zinflate.cpp

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

// This is a complete reimplementation of the DEFLATE decompression algorithm.
// It should not be affected by any security vulnerabilities in the zlib 
// compression library. In particular it is not affected by the double free bug
// (http://www.kb.cert.org/vuls/id/368819).

#include "pch.h"
#include "zinflate.h"

NAMESPACE_BEGIN(CryptoPP)

struct CodeLessThan
{
	inline bool operator()(const CryptoPP::HuffmanDecoder::code_t lhs, const CryptoPP::HuffmanDecoder::CodeInfo &rhs)
		{return lhs < rhs.code;}
};

inline bool LowFirstBitReader::FillBuffer(unsigned int length)
{
	while (m_bitsBuffered < length)
	{
		byte b;
		if (!m_store.Get(b))
			return false;
		m_buffer |= (unsigned long)b << m_bitsBuffered;
		m_bitsBuffered += 8;
	}
	assert(m_bitsBuffered <= sizeof(unsigned long)*8);
	return true;
}

inline unsigned long LowFirstBitReader::PeekBits(unsigned int length)
{
	bool result = FillBuffer(length);
	assert(result);
	return m_buffer & (((unsigned long)1 << length) - 1);
}

inline void LowFirstBitReader::SkipBits(unsigned int length)
{
	assert(m_bitsBuffered >= length);
	m_buffer >>= length;
	m_bitsBuffered -= length;
}

inline unsigned long LowFirstBitReader::GetBits(unsigned int length)
{
	unsigned long result = PeekBits(length);
	SkipBits(length);
	return result;
}

inline HuffmanDecoder::code_t HuffmanDecoder::NormalizeCode(HuffmanDecoder::code_t code, unsigned int codeBits)
{
	return code << (MAX_CODE_BITS - codeBits);
}

void HuffmanDecoder::Initialize(const unsigned int *codeBits, unsigned int nCodes)
{
	// the Huffman codes are represented in 3 ways in this code:
	//
	// 1. most significant code bit (i.e. top of code tree) in the least significant bit position
	// 2. most significant code bit (i.e. top of code tree) in the most significant bit position
	// 3. most significant code bit (i.e. top of code tree) in n-th least significant bit position,
	//    where n is the maximum code length for this code tree
	//
	// (1) is the way the codes come in from the deflate stream
	// (2) is used to sort codes so they can be binary searched
	// (3) is used in this function to compute codes from code lengths
	//
	// a code in representation (2) is called "normalized" here
	// The BitReverse() function is used to convert between (1) and (2)
	// The NormalizeCode() function is used to convert from (3) to (2)

	if (nCodes == 0)
		throw Err("null code");

	m_maxCodeBits = *std::max_element(codeBits, codeBits+nCodes);

	if (m_maxCodeBits > MAX_CODE_BITS)
		throw Err("code length exceeds maximum");

	if (m_maxCodeBits == 0)
		throw Err("null code");

	// count number of codes of each length
	SecBlockWithHint<unsigned int, 15+1> blCount(m_maxCodeBits+1);
	std::fill(blCount.begin(), blCount.end(), 0);
	unsigned int i;
	for (i=0; i<nCodes; i++)
		blCount[codeBits[i]]++;

	// compute the starting code of each length
	code_t code = 0;
	SecBlockWithHint<code_t, 15+1> nextCode(m_maxCodeBits+1);
	nextCode[1] = 0;
	for (i=2; i<=m_maxCodeBits; i++)
	{
		// compute this while checking for overflow: code = (code + blCount[i-1]) << 1
		if (code > code + blCount[i-1])
			throw Err("codes oversubscribed");
		code += blCount[i-1];
		if (code > (code << 1))
			throw Err("codes oversubscribed");
		code <<= 1;
		nextCode[i] = code;
	}

	if (code > (1 << m_maxCodeBits) - blCount[m_maxCodeBits])
		throw Err("codes oversubscribed");
	else if (m_maxCodeBits != 1 && code < (1 << m_maxCodeBits) - blCount[m_maxCodeBits])
		throw Err("codes incomplete");

	// compute a vector of <code, length, value> triples sorted by code
	m_codeToValue.resize(nCodes - blCount[0]);
	unsigned int j=0;
	for (i=0; i<nCodes; i++) 
	{
		unsigned int len = codeBits[i];
		if (len != 0)
		{
			code = NormalizeCode(nextCode[len]++, len);
			m_codeToValue[j].code = code;
			m_codeToValue[j].len = len;
			m_codeToValue[j].value = i;
			j++;
		}
	}
	std::sort(m_codeToValue.begin(), m_codeToValue.end());

	// initialize the decoding cache
	m_cacheBits = STDMIN(9U, m_maxCodeBits);
	m_cacheMask = (1 << m_cacheBits) - 1;
	m_normalizedCacheMask = NormalizeCode(m_cacheMask, m_cacheBits);
	assert(m_normalizedCacheMask == BitReverse(m_cacheMask));

	if (m_cache.size() != 1 << m_cacheBits)
		m_cache.resize(1 << m_cacheBits);

	for (i=0; i<m_cache.size(); i++)
		m_cache[i].type = 0;
}

void HuffmanDecoder::FillCacheEntry(LookupEntry &entry, code_t normalizedCode) const
{
	normalizedCode &= m_normalizedCacheMask;
	const CodeInfo &codeInfo = *(std::upper_bound(m_codeToValue.begin(), m_codeToValue.end(), normalizedCode, CodeLessThan())-1);
	if (codeInfo.len <= m_cacheBits)
	{
		entry.type = 1;
		entry.value = codeInfo.value;
		entry.len = codeInfo.len;
	}
	else
	{
		entry.begin = &codeInfo;
		const CodeInfo *last = & *(std::upper_bound(m_codeToValue.begin(), m_codeToValue.end(), normalizedCode + ~m_normalizedCacheMask, CodeLessThan())-1);
		if (codeInfo.len == last->len)
		{
			entry.type = 2;
			entry.len = codeInfo.len;
		}
		else
		{
			entry.type = 3;
			entry.end = last+1;
		}
	}
}

inline unsigned int HuffmanDecoder::Decode(code_t code, /* out */ value_t &value) const
{
	assert(m_codeToValue.size() > 0);
	LookupEntry &entry = m_cache[code & m_cacheMask];

	code_t normalizedCode;
	if (entry.type != 1)
		normalizedCode = BitReverse(code);

	if (entry.type == 0)
		FillCacheEntry(entry, normalizedCode);

	if (entry.type == 1)
	{
		value = entry.value;
		return entry.len;
	}
	else
	{
		const CodeInfo &codeInfo = (entry.type == 2)
			? entry.begin[(normalizedCode << m_cacheBits) >> (MAX_CODE_BITS - (entry.len - m_cacheBits))]
			: *(std::upper_bound(entry.begin, entry.end, normalizedCode, CodeLessThan())-1);
		value = codeInfo.value;
		return codeInfo.len;
	}
}

bool HuffmanDecoder::Decode(LowFirstBitReader &reader, value_t &value) const
{
	reader.FillBuffer(m_maxCodeBits);
	unsigned int codeBits = Decode(reader.PeekBuffer(), value);
	if (codeBits > reader.BitsBuffered())
		return false;
	reader.SkipBits(codeBits);
	return true;
}

// *************************************************************

Inflator::Inflator(BufferedTransformation *attachment, bool repeat, int propagation)
	: AutoSignaling<Filter>(attachment, propagation)
	, m_state(PRE_STREAM), m_repeat(repeat)
	, m_decodersInitializedWithFixedCodes(false), m_reader(m_inQueue)
{
}

void Inflator::IsolatedInitialize(const NameValuePairs &parameters)
{
	m_state = PRE_STREAM;
	parameters.GetValue("Repeat", m_repeat);
	m_inQueue.Clear();
	m_reader.SkipBits(m_reader.BitsBuffered());
}

inline void Inflator::OutputByte(byte b)
{
	m_window[m_current++] = b;
	if (m_current == m_window.size())
	{
		ProcessDecompressedData(m_window + m_lastFlush, m_window.size() - m_lastFlush);
		m_lastFlush = 0;
		m_current = 0;
	}
	if (m_maxDistance < m_window.size())
		m_maxDistance++;
}

void Inflator::OutputString(const byte *string, unsigned int length)
{
	while (length--)
		OutputByte(*string++);
}

void Inflator::OutputPast(unsigned int length, unsigned int distance)
{
	if (distance > m_maxDistance)
		throw BadBlockErr();
	unsigned int start;
	if (m_current > distance)
		start = m_current - distance;
	else
		start = m_current + m_window.size() - distance;

	if (start + length > m_window.size())
	{
		for (; start < m_window.size(); start++, length--)
			OutputByte(m_window[start]);
		start = 0;
	}

	if (start + length > m_current || m_current + length >= m_window.size())
	{
		while (length--)
			OutputByte(m_window[start++]);
	}
	else
	{
		memcpy(m_window + m_current, m_window + start, length);
		m_current += length;
		m_maxDistance = STDMIN((unsigned int)m_window.size(), m_maxDistance + length);
	}
}

unsigned int Inflator::Put2(const byte *inString, unsigned int length, int messageEnd, bool blocking)
{
	if (!blocking)
		throw BlockingInputOnly("Inflator");

	LazyPutter lp(m_inQueue, inString, length);
	ProcessInput(messageEnd != 0);

	if (messageEnd)
		if (!(m_state == PRE_STREAM || m_state == AFTER_END))
			throw UnexpectedEndErr();

	Output(0, NULL, 0, messageEnd, blocking);
	return 0;
}

bool Inflator::IsolatedFlush(bool hardFlush, bool blocking)

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产日韩精品视频一区| 色婷婷综合久色| 久久久久亚洲蜜桃| 国产一区二区三区免费| 国产精品美女久久久久久久| 91麻豆精品一区二区三区| 亚洲卡通欧美制服中文| 欧美日韩电影一区| 极品销魂美女一区二区三区| 欧美激情综合五月色丁香| 日本电影亚洲天堂一区| 石原莉奈在线亚洲三区| 精品国产乱码久久久久久蜜臀| 国产盗摄一区二区| 亚洲综合一区二区| 欧美草草影院在线视频| 成人午夜私人影院| 亚洲午夜视频在线| 精品国产乱码久久久久久1区2区 | 日韩免费电影一区| 国产精品一区二区黑丝| 一区二区三区.www| 91精品国产色综合久久久蜜香臀| 国产自产视频一区二区三区| 亚洲手机成人高清视频| 欧美嫩在线观看| 国产乱码精品一区二区三区av| 亚洲美女视频在线观看| 日韩欧美国产电影| 91免费视频观看| 美国av一区二区| 亚洲三级电影网站| 欧美大胆一级视频| 色婷婷久久99综合精品jk白丝 | 亚洲精品成人少妇| 日韩欧美在线不卡| 91久久久免费一区二区| 国产资源在线一区| 亚洲成a人片在线观看中文| 国产午夜精品一区二区三区四区| 欧日韩精品视频| 国产91在线看| 秋霞国产午夜精品免费视频| 亚洲色图视频网| 久久精品免视看| 91 com成人网| 91久久精品一区二区| 国产乱码精品一区二区三| 日韩和欧美一区二区| 综合久久综合久久| 亚洲精品在线免费播放| 欧美日韩国产精选| 91首页免费视频| 成人网页在线观看| 国产精品主播直播| 日韩成人精品在线| 性感美女久久精品| 亚洲精品成人精品456| 国产精品乱码人人做人人爱| www激情久久| 欧美一区二区人人喊爽| 欧美日韩一区国产| 欧美三级中文字幕| 欧美丝袜丝交足nylons| 色综合天天做天天爱| av在线综合网| eeuss鲁片一区二区三区在线看| 极品少妇xxxx精品少妇偷拍| 免费观看在线色综合| 日韩vs国产vs欧美| 奇米影视一区二区三区| 青青草成人在线观看| 蜜臀av一区二区| 日韩—二三区免费观看av| 日韩国产一二三区| 日本va欧美va欧美va精品| 首页国产丝袜综合| 视频在线观看国产精品| 日本伊人午夜精品| 美国av一区二区| 国产在线不卡一卡二卡三卡四卡| 国内一区二区视频| 国产精品一线二线三线精华| 国产精品一区二区三区乱码 | 国产精品乱人伦中文| 国产精品国模大尺度视频| 欧美韩日一区二区三区四区| 国产精品久久久久影视| 中文字幕在线免费不卡| 亚洲女爱视频在线| 亚洲一区二区高清| 日本不卡视频一二三区| 国产综合色精品一区二区三区| 国产精品影视在线观看| 成人av网在线| 欧美视频在线观看一区| 日韩视频免费观看高清完整版在线观看 | 国产在线视频一区二区三区| 精品一区二区av| 高清不卡一二三区| 91伊人久久大香线蕉| 欧美日韩视频一区二区| 日韩精品专区在线| 中文字幕国产精品一区二区| 亚洲欧美另类图片小说| 日韩不卡一二三区| 成人美女视频在线观看| 欧美三级一区二区| 久久久国产午夜精品| 亚洲欧美aⅴ...| 麻豆精品一二三| av日韩在线网站| 欧美精品v国产精品v日韩精品| 久久久久99精品国产片| 亚洲黄网站在线观看| 韩国精品一区二区| 在线精品视频小说1| 欧美精品一区二区久久婷婷| 一区二区三区中文在线观看| 精品一二线国产| 91久久一区二区| 337p粉嫩大胆噜噜噜噜噜91av | 成人精品免费看| 欧美精品tushy高清| 国产欧美精品一区| 同产精品九九九| www.在线成人| 2欧美一区二区三区在线观看视频| 亚洲欧美在线aaa| 激情五月婷婷综合| 91福利资源站| 亚洲国产成人在线| 日本色综合中文字幕| 色婷婷综合在线| 国产精品女人毛片| 麻豆成人91精品二区三区| 色偷偷一区二区三区| 久久久久久久久久久久久久久99 | 玉足女爽爽91| 国产乱国产乱300精品| 欧美日韩高清一区二区不卡| 亚洲色图都市小说| 成人午夜私人影院| 久久先锋资源网| 久久国产精品99精品国产| 色老汉av一区二区三区| 国产精品久久久久毛片软件| 国产一区二区三区免费播放| 欧美一区二区三区思思人| 亚洲综合视频网| 91色九色蝌蚪| 国产精品欧美一区二区三区| 国产一区999| 久久综合色播五月| 久久国产日韩欧美精品| 3atv在线一区二区三区| 亚洲成精国产精品女| 欧美视频在线观看一区二区| 一区二区三区四区精品在线视频| 播五月开心婷婷综合| 国产精品毛片高清在线完整版| 福利一区在线观看| 国产欧美日韩精品在线| 国产成人精品aa毛片| 欧美国产综合色视频| 国产精品99久久久久| 国产欧美一区二区在线观看| 国产激情91久久精品导航| 2欧美一区二区三区在线观看视频| 精品一区二区在线视频| 久久综合丝袜日本网| 国产高清不卡一区| 国产欧美日韩不卡| av不卡一区二区三区| 亚洲视频在线一区观看| 色偷偷一区二区三区| 亚洲午夜激情网站| 欧美日韩国产综合一区二区三区| 日韩激情视频在线观看| 欧美videos中文字幕| 国产剧情av麻豆香蕉精品| 国产精品免费观看视频| 91蜜桃在线观看| 亚洲国产精品精华液网站| 欧美电影一区二区| 精品一区二区三区蜜桃| 国产精品视频一区二区三区不卡| 91在线视频免费观看| 亚洲午夜影视影院在线观看| 日韩视频免费观看高清在线视频| 国产伦精品一区二区三区免费迷 | 欧美最猛性xxxxx直播| 日欧美一区二区| 欧美精品一区二区久久久| www.色综合.com| 五月激情综合网| 国产午夜一区二区三区| 色婷婷av一区二区三区软件| 日本成人在线一区| 国产精品久久久久久久久免费桃花|