说什么都不如代码来得直接。 #include "RLECompression.h" int RLE8Compress(BYTE*in, int Count, BYTE*out) { BYTE L; int f_size = 0; while (Count) { L = 0; while((Count>1)&&(in[0]==in[1])&&(L<=0x7E)) //如果相等,可压缩 { Count--; in++; L++; } if (L) { out[0] = L|0x80; out[1] = in[0]; out += 2; f_size += 2; in++; Count--; L = 0; }
while ((Count>1)&&(in[0]!=in[1])&&(L<=0x7E))//不可压缩 记录原数据长度 { out[1] = in[0]; L++; Count--; in++; out++; } if (L) { out -= L; out[0] = L; out += L+1; f_size += L+1; } if (Count==1) //最后的一个数据 { out[0] = 1; out[1] = in[0]; Count--; f_size += 2; } } return f_size; } int RLE8UnCompress(BYTE*in, int Count, BYTE*out) { BYTE L; int f_size = 0; while (Count) { //if (in[0]&0x7F) if (in[0]&0x80) //已压缩 { L = (in[0]&0x7F) + 1; memset(out, in[1], L); out += L; f_size += L; in += 2; Count-=2; } else //未压缩 { L = in[0]&0x7F; in++; memcpy(out, in, L); in += L; out += L; f_size += L; Count -= L+1; } } return f_size; } int RLE16Compress(WORD*in, int Count, WORD*out) { WORD L; int f_size = 0; while (Count) { L = 0; while((Count>1)&&(in[0]==in[1])&&(L<=0x7FFE)) //如果相等,可压缩 { Count--; in++; L++; } if (L) { out[0] = L|0x8000; out[1] = in[0]; out += 2; f_size += 2; in++; Count--; L = 0; } while ((Count>1)&&(in[0]!=in[1])&&(L<=0x7FFE)) //不可压缩 记录原数据长度 { out[1] = in[0]; L++; Count--; in++; out++; } if (L) { out -= L; out[0] = L; out += L+1; f_size += L+1; } if (Count==1) //最后的一个数据 { out[0] = 1; out[1] = in[0]; Count--; f_size += 2; } } return f_size * sizeof(WORD); } int RLE16UnCompress(WORD*in, int Count, WORD*out) { WORD L; int f_size = 0; while (Count) { //if (in[0]&0x7F) if (in[0]&0x8000) //已压缩 { L = (in[0]&0x7FFF) + 1; for (int I=0;I<L;++I) { out[0] = in[1]; out++; f_size++; } //memset(out, in[1], L); //out += L; //f_size += L; in += 2; Count-=2; } else //未压缩 { L = in[0]&0x7FFF; in++; memcpy(out, in, L * sizeof(WORD)); in += L; out += L; f_size += L; Count -= L+1; } } return f_size * sizeof(WORD); } int RLE32Compress(DWORD*in, int Count, DWORD*out) { DWORD L; int f_size = 0; while (Count) { L = 0; while((Count>1)&&(in[0]==in[1])&&(L<=0x7FFFFFFE)) //如果相等,可压缩 { Count--; in++; L++; } if (L) { out[0] = L|0x80000000; out[1] = in[0]; out += 2; f_size += 2; in++; Count--; L = 0; } while ((Count>1)&&(in[0]!=in[1])&&(L<=0x7FFFFFFE)) //不可压缩 记录原数据长度 { out[1] = in[0]; L++; Count--; in++; out++; } if (L) { out -= L; out[0] = L; out += L+1; f_size += L+1; } if (Count==1) //最后的一个数据 { out[0] = 1; out[1] = in[0]; Count--; f_size += 2; } } return f_size * sizeof(DWORD); } int RLE32UnCompress(DWORD*in, int Count, DWORD*out) { DWORD L; int f_size = 0; while (Count) { //if (in[0]&0x7F) if (in[0]&0x80000000) //已压缩 { L = (in[0]&0x7FFFFFFF) + 1; for (int I=0;I<L;++I) { out[0] = in[1]; out++; f_size++; } //memset(out, in[1], L); //out += L; //f_size += L; in += 2; Count-=2; } else //未压缩 { L = in[0]&0x7FFFFFFF; in++; memcpy(out, in, L * sizeof(DWORD)); in += L; out += L; f_size += L; Count -= L+1; } } return f_size * sizeof(DWORD); } |