关于C++类库KYLib: 固定缓冲区的压缩/解压缩类源码(五)

2014-11-24 08:13:32 · 作者: · 浏览: 4
sult = false;
Word wIndex, wHash, wValue;
// 计算 Hash 值
wHash = ((Word)APos[0] << 8) ^ ((Word)APos[1] << 4) ^ (Word)APos[2];
wHash = ((wHash * Hash_RandomGene) >> 4) & Mask_Hash;
wValue = FHash[wHash];
wIndex = (Word)FDataSize & Mask_Index;
AOffset = (wIndex - wValue) & Mask_Index;
FHash[wHash]= wIndex;
// 判断偏移量是否有效
if ((wValue <= Mask_Index) && (AOffset < Max_Offset) && (AOffset != 0))
{
// 初始化
Word wDepth = (Word)Min(AEnd - APos, Max_Depth);
Byte* pPos = APos;
Byte* pEnd = APos + wDepth;
Byte* pDest;
// 检查是否超出上下文
if (FDataSize - FLastSize >= AOffset)
{
pDest = APos - AOffset;
while ((pPos < pEnd) && (*pPos == *pDest))
{
pPos++;
pDest++;
}
}
else
{
// 初始化
Word wSize = (Word)(FDataSize - FLastSize); // (FDataSize - FLastSize < AOffset)
Word wFront = AOffset - wSize;
// 计算起始位置
pDest = (Byte*)FContext;
if (FLastSize >= Max_Offset)
pDest += Max_Offset - wFront;
else
pDest += FLastSize - wFront;
// 判断是否分二部分比较
if (wFront < wDepth)
{
// 初始化
Byte* pDestEnd = pDest + wFront;
// 前半部分比较
while ((pDest < pDestEnd) && (*pPos == *pDest))
{
pPos++;
pDest++;
}
// 判断是否需要继续匹配
if (pDest == pDestEnd)
{
pDest = APos - wSize;
while ((pPos < pEnd) && (*pPos == *pDest))
{
pPos++;
pDest++;
}
}
}
else
while ((pPos < pEnd) && (*pPos == *pDest))
{
pPos++;
pDest++;
}
}
// 检查匹配长度
wDepth = (Word)(pPos - APos);
if (wDepth >= 3)
{
ADepth = (Byte)(wDepth - 3);
result = true;
}
}
// 返回结果
return result;
}
// ---------------- 保护函数 ----------------
// ---------------- 公有函数 ----------------
// 设置压缩结果缓冲区的最大尺寸
bool TKYFixedPack::SetMaxSize(Word ASize)
{
// 初始化
bool result = true;
// 判断状态
if (FIsPacking)
result = false;
else if (FMaxSize != ASize)
{
// 初始化
char* pData = NULL;
// 判断是否需要分配
if (ASize != 0)
{
pData = (char*)malloc(ASize + 8); // 冗余长度, 防止编码超出
result = (pData != NULL);
}
// 判断是否继续
if (result)
{
// 先释放
if (FDest != NULL)
free(FDest);
// 交换
FDest = pData;
FMaxSize = ASize;
}
}
// 返回结果
return result;
}
// 重置
void TKYFixedPack::Reset()
{
if (!FIsPacking)
{
// 置空
FSize = 0;
FBitBegin = 0;
FDataSize = 0;
FLastSize = 0;
// 初始化哈希表
memset(FHash, -1, sizeof(FHash));
}
}
// 压缩缓冲区
bool TKYFixedPack::Pack(const char* ABuffer, long ASize, Word AMax)
{
// 检查是否正在压缩及检查参数
if (FIsPacking || (FDest == NULL) || (ASize <= 0) || (ABuffer == NULL))
return false;
// 初始化
bool result = false;
// 置压缩状态
FIsPacking = true;
// 操作
try
{
// 初始化
Word wSize, wOffset;
PCode pCode;
Byte* pSame;
Byte* pLast;
Byte* pPos = (Byte*)ABuffer;
Byte* pEnd