关于C++类库KYLib: 固定缓冲区的压缩/解压缩类源码(六)
= pPos + ASize - 2;
Byte* pBuffEnd = pPos + ASize;
char* pDest = FDest + FSize - (Byte)(FBitBegin != 0);
char* pDestEnd = FDest + Min(FMaxSize, AMax);
Byte byteDepth= 0;
Byte byteBegin= FBitBegin;
bool boolOver = false;
bool boolSame, boolNext;
Byte byteLen1, byteLen2;
// 循环匹配
while (pPos < pEnd)
{
// 检查是否相同数据
pLast = Min(pBuffEnd, pPos + Max_Offset + 10);
pSame = pPos + 1;
while ((pSame < pLast) && (*pSame == *pPos))
pSame++;
// 检查相同数据尺寸是否大于等于 3
wSize = pSame - pPos;
boolSame = (wSize >= 3);
if (wSize <= 32)
{
boolNext = DoMatch(pPos, pBuffEnd, wOffset, byteDepth);
if (boolNext && boolSame && (byteDepth + 3 >= wSize) && (wOffset != 1))
{
if (byteDepth + 3 != wSize)
boolSame = false;
else
{
byteLen1 = (wSize < 11) _Codes_Offset[0].Length + 11
: _Codes_Offset[0].Length + _Codes_Offset[wSize - 11].Length + 8;
byteLen2 = _Codes_Offset[wOffset].Length + _Codes_Depth[byteDepth].Length;
boolSame = (byteLen1 <= byteLen2);
}
}
}
// 判断压缩为相同数据
if (boolSame)
{
// 压缩标志
BoolToBuffer(pDest, byteBegin, true);
// 偏移量编码
pCode = &_Codes_Offset[wSize >= 11];
if (pCode->Length != 0)
BitsToBuffer(pDest, byteBegin, pCode->Bits, pCode->Length);
// 深度编码
if (wSize < 11)
ByteToBuffer(pDest, byteBegin, (Byte)(wSize - 3), 3);
else
{
pCode = &_Codes_Offset[wSize - 11];
if (pCode->Length != 0)
BitsToBuffer(pDest, byteBegin, pCode->
Bits, pCode->Length);
}
// 相同的字符
CharToBuffer(pDest, byteBegin, *pPos);
FDataSize += wSize;
pPos = pSame;
}
else if (boolNext)
{
// 压缩标志
BoolToBuffer(pDest, byteBegin, true);
// 偏移量编码
pCode = &_Codes_Offset[wOffset];
if (pCode->Length != 0)
BitsToBuffer(pDest, byteBegin, pCode->Bits, pCode->Length);
// 深度编码
pCode = &_Codes_Depth[byteDepth];
if (pCode->Length != 0)
BitsToBuffer(pDest, byteBegin, pCode->Bits, pCode->Length);
// 更新位置
wSize = byteDepth + 3;
FDataSize += wSize;
pPos += wSize;
}
else
{
// 未压缩标志并存放字节
BoolToBuffer(pDest, byteBegin, false);
CharToBuffer(pDest, byteBegin, *pPos);
// 更新位置
FDataSize++;
pPos++;
}
// 检查是否溢出
if (pDest >= pDestEnd)
{
boolOver = true;
break;
}
}
// 判断是否未溢出
if (!boolOver)
{
// 末尾 2 个字节
while (pPos < pBuffEnd)
{
// 未压缩标志并存放字节
BoolToBuffer(pDest, byteBegin, false);
CharToBuffer(pDest, byteBegin, *pPos);
// 更新位置
FDataSize++;
pPos++;
}
// 检查是否溢出
if (pDest < pDestEnd)
{
FSize = (Word)(pDest - FDest) + (Byte)(byteBegin != 0);
FBitBegin = byt