我是新人,前两天才知道有这个论坛,看了LS的解压缩,不知道你们如何测试出来的,我觉得GetCode函数应该改进,昨晚测到0点30分,应该快了不少,方法是利用查表代替测试Bit位。(为了能够让大家看明白意思,我没有做进一步的优化)
m_bitPos初始化为0,不是7了。
struct CompressValue
{
union
{
int nValue;
BYTE byValue[4];
};
};
int g_CodeLen[] =
{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 4
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 5
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 6
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 7
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 10
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 11
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 12
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 13
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 14
4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 7, 8, // 15
};
int g_nValue[] =
{
0, 2, 6, 14, 30, 62, 126, 254
};
int g_nMask[] =
{
1, 3, 7, 15, 31, 63, 127, 255, 511
};
unsigned int GetCode()
{
// 得到3个字节的数据, 反序
CompressValue data;
data.byValue[3] = m_pSrc[m_srcPos];
data.byValue[2] = m_pSrc[m_srcPos+1];
data.byValue[1] = m_pSrc[m_srcPos+2];
// 移位, 使得最高位是有效数据
data.nValue <<= m_bitPos;
// 查表得到有效数据里面Bit==1的个数
int nSetBitsNum = g_CodeLen[data.byValue[3]];
// 查表得到uCode1
unsigned int uCode1 = g_nValue[nSetBitsNum];
// 数据移位, 消去uCode1使用部分
// 同时使得data.byValue[3]的Bit0就是uCode2的Bit0
// x <<= y, 当 y < 0 时有问题, 如果直接用汇编写, 就可能不需要分之判断
// (我的8086的汇编忘光了, 但一些DSP芯片支持这样的指令的)
int nShiftNum = (2*(nSetBitsNum+1) - 8);
if (nShiftNum > 0)
{
data.nValue <<= nShiftNum;
}
else
{
data.nValue >>= abs(nShiftNum);
}
// 通过掩码计算, 得到uCode2
unsigned int uCode2 = (data.byValue[3] & g_nMask[nSetBitsNum+1]);
// 计算bitPos和srcPos的改变, 并改变之
m_srcPos += ((2*(nSetBitsNum+1)+m_bitPos) >> 3);
m_bitPos += 2*(nSetBitsNum+1);
m_bitPos &= 7;
return uCode1 + uCode2;
}
|