| | |
|
组别 | 诸侯 |
级别 | 征东将军 |
好贴 | 4 |
功绩 | 1845 |
帖子 | 5799 |
编号 | 622 |
注册 | 2004-7-7 |
| |
| | |
|
|
|
作者 Maxwell
转载请注明 转自轩辕春秋文化论坛 设计与修改区http://www.xycq.net/forum/index.php?showforum=48
原帖地址http://www.xycq.net/forum/index.php?showtopic=35276
谢谢合作
转载前请先联系作者
这是我写的解压缩代码。
调用Decode(BYTE *dict, BYTE *in, size_t insize, BYTE *out, size_t outsize)函数解压缩,dict为ls11的字典,in为压缩的数据,insize为压缩数据长度,out为存放原文的位置,outsize为原文长度,out要保证至少有outsize字节长。函数执行完毕后out内的内容即为解压出来的原文。
注意在调用解压函数前要保证数据确实是压缩过的,如果要传入的insize == outsize那说明是没有压缩的,就不能调用解压函数。
调用示例
TLS11 ls11;
if (insize != outsize)
{
ls11.Decode(dict, in, insize, out, outsize);
}
ls11.h
=====================
// 作者: Maxwell
// 出处: 轩辕春秋文化论坛 设计与修改区
// http://www.xycq.net/forum/index.php?showforum=48
// 授权使用于非商业用途
// 使用本代码请保留上述文字
//---------------------------------------------------------------------------
#ifndef LS11H
#define LS11H
#include <_stddef.h>
//---------------------------------------------------------------------------
typedef unsigned char BYTE;
class TLS11
{
public:
bool Decode(const BYTE *dict, const BYTE *in, size_t insize, BYTE *out, size_t outsize);
bool Encode(BYTE *dict, BYTE *in, size_t insize, BYTE *out, size_t outsize);
protected:
size_t _inpos;
int _bitpos;
const BYTE *_in;
unsigned int GetCode(void);
};
#endif
ls11.cpp
=====================
// 作者: Maxwell
// 出处: 轩辕春秋文化论坛 设计与修改区
// http://www.xycq.net/forum/index.php?showforum=48
// 授权使用于非商业用途
// 使用本代码请保留上述文字
//---------------------------------------------------------------------------
#pragma hdrstop
#include "ls11.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
bool TLS11:ecode(const BYTE *dict, const BYTE *in, size_t insize, BYTE *out, size_t outsize)
{
size_t outpos = 0;
unsigned int code, off, len;
bool rs = true;
_inpos = 0;
_bitpos = 7;
_in = in;
while (_inpos < insize && outpos < outsize)
{
code = GetCode();
if (code < 256)
{
out[outpos++] = dict[code];
}
else
{
off = code - 256;
len = GetCode() + 3;
for (unsigned int i = 0; i < len; i++)
{
out[outpos] = out[outpos - off];
outpos++;
}
}
}
return rs;
}
bool TLS11::Encode(BYTE *dict, BYTE *in, size_t insize, BYTE *out, size_t outsize)
{
}
unsigned int TLS11::GetCode(void)
{
unsigned int code, code2;
int l;
BYTE bit;
code = 0;
code2 = 0;
l = 0;
do
{
bit = (BYTE)((_in[_inpos] >> _bitpos) & 0x01);
code = (code << 1) | bit;
l++;
_bitpos--;
if (_bitpos < 0)
{
_bitpos = 7;
_inpos++;
}
}while (bit);
for (int i = 0; i < l; i++)
{
bit = (BYTE)((_in[_inpos] >> _bitpos) & 0x01);
code2 = (code2 << 1) | bit;
_bitpos--;
if (_bitpos < 0)
{
_bitpos = 7;
_inpos++;
}
}
code += code2;
return code;
}
|
|
|
|