32bitTGA的rle压缩以及解压算法(二)
来源:互联网 发布:云计算 国家政策 2014 编辑:程序博客网 时间:2024/05/12 10:26
闲话少说,直接先看代码
void CompressData(void * pSrc, void * pDst, int srcSize, DWORD & dstSize)
{
if( (pSrc == NULL) || (pDst == NULL) )
{
return ;
}
int totalCompress = 0;
int repCount = 1;
DWORD blockHead = 0;
DWORD * pComData = (DWORD *)pDst;
DWORD * pRawData = (DWORD *)pSrc;
//////////////////////////////////////////////////////////////////////////
/// DWORD Size = BYTE Size / 4
int len = srcSize >> 2;
dstSize = 0;
while(totalCompress < len)
{
if( !(*(pRawData+repCount-1)&0xff000000) && !(*(pRawData+repCount)&0xff000000) )
{
while( !(*(pRawData+repCount-1)&0xff000000) && !(*(pRawData+repCount)&0xff000000)
&& ((totalCompress+repCount)<len) )
{
++repCount;
}
blockHead = 0x11000000 | repCount;
*pComData++ = blockHead;
*pComData++ = 0;
dstSize += 2;
}
/// 看是否是0x10@@@@@@的情况
else if( *pRawData == *(pRawData+repCount) )
{
while( *pRawData == *(pRawData+repCount)
&& ((totalCompress+repCount)<len))
{
++repCount;
}
blockHead = 0x10000000 | repCount;
*pComData++ = blockHead;
*pComData++ = *pRawData;
dstSize += 2;
}
/// 看是否为0x00@@@@@@的情况
else //if( (*(pRawData+repCount-1) != *(pRawData+repCount)) && (*(pRawData+repCount)&0xff000000) )
{
while( *(pRawData+repCount-1) != *(pRawData+repCount)
&& ((totalCompress+repCount)<len) )
{
if( !(*(pRawData+repCount-1)&0xff000000) &&
!(*(pRawData+repCount)&0xff000000) )
{
break;
}
++repCount;
}
blockHead = 0x00000000 | repCount;
*pComData++ = blockHead;
memcpy(pComData, pRawData, sizeof(DWORD)*repCount);
pComData += repCount;
dstSize += repCount+1;
}
pRawData += repCount;
totalCompress += repCount;
repCount = 1;
}
dstSize *= 4;
}
稍显繁琐,代码写的不够整齐,不过基本意思就是这样了
解压代码:
void DeCompress(void * pSrc, void * pDst, DWORD srcSize, DWORD & dstSize)
{
DWORD nowSize = 0;
DWORD tSize = srcSize;// >> 2;
DWORD * pDSrc = (DWORD *)pSrc;
DWORD * pDstData = (DWORD *)pDst;
dstSize = 0;
DWORD dSize = 0;
// C++版本
// while(nowSize < tSize)
// {
// DWORD blockData = 0;
// blockData = *pDSrc++;
// if( !(blockData & 0xff000000) )
// {
// int len = blockData & 0x00ffffff;
// //fread(pDstData, sizeof(DWORD), len, m_pANMFile);
// memcpy(pDstData, pDSrc, sizeof(DWORD)*len);
// pDstData += len;
// pDSrc += len;
// nowSize += len+1;
//
// dstSize += len;
// }
// else
// {
// int len = blockData & 0x00ffffff;
// DWORD CompData;
// CompData = *pDSrc++;
// for(int i=0; i<len; ++i)
// {
// *pDstData++ = CompData;
// }
// nowSize += 2;
//
// dstSize += len;
// }
// }
// dstSize *= 4;
// asm 版本
__asm
{
mov esi, pDSrc
mov edi, pDstData
loop_start:
lodsd ; 将block读取到eax中
mov ebx, eax
and ebx, 0x00ffffff ; ebx 存放数据的长度信息
and eax, 0xff000000
jnz compress
; 原始数据
mov ecx, ebx
cld
rep movsd
mov edx, ebx ; 获取length + 1
inc edx
jmp new_block
compress:
; 压缩数据
mov ecx, ebx
mov edx, 0x02
lodsd
cld
rep stosd
new_block:
add ebx, dSize ; 计算总的长度信息
lea ecx, dSize
mov [ecx], ebx
add edx, nowSize ; 计算当前已经解压的长度
lea ecx, nowSize
mov [ecx], edx
mov eax, tSize
cmp edx, eax
jnz loop_start
};
dstSize = 4 * dSize;
}
原理见另外一篇文章
- 32bitTGA的rle压缩以及解压算法(二)
- 32bitTGA的rle压缩以及解压算法(一)
- RLE压缩和解压算法以及链表翻转
- RLE 行程长度压缩算法的改进
- RLE 压缩算法
- RLE压缩算法
- RLE压缩算法详解
- RLE行程长度压缩算法
- RLE行程长度压缩算法
- RLE行程长度压缩算法
- RLE行程长度压缩算法
- RLE流压缩——简单算法
- RLE行程长度编码压缩算法
- RLE行程长度编码压缩算法
- BMP文件格式及RlE压缩算法
- RLE行程长度压缩算法C版本
- JPEG2000压缩DICOM文件的解压(二)
- C语言实现RLE(游程编码)压缩算法(粘贴就能用)
- 打靶归来
- .NET
- 空间和时间 ----节选《时间简史》 霍金
- 可怜的角色
- jsp servlet tips and articles
- 32bitTGA的rle压缩以及解压算法(二)
- java与SQL Server 2000的连接
- 软考没通过
- 七个好习惯(The 7 habits)
- 基于JK的tomcat负载均衡
- 八数码问题——A*搜索
- 32bitTGA的rle压缩以及解压算法(一)
- 使用RMI和CORBA进行分布式java程序设计
- 在这里工作的目标