#include <stdio.h>
#include <string.h>
#define BYTE unsigned char
//0123456789012345678901234567890
char orig[31] = "01234567890AAAAAAAAAAAAAA567890";
char comp[128];
int rle_compress(void *ds, void *sr, int len)
{
int c,
l,
div;
char *s,
*d,
*p,
*o;
d = (char *)ds;
p = o = (char*)sr;
l = 0;
div = 0;
while (len > 0) {
c = 0;
s = p;
while ((*p == *s) && (len)) {
p++;
c++;
len--;
}
if ((c > 2) || (len == 0)) {
if (c <= 2) {
div += c;
c ^= c;
}
if (div) {
*d++ = div;
l++;
while (div) {
*d++ = *o++;
l++;
div--;
}
}
if (c) {
l += 2;
*d++ = -c;
*d++ = *s;
}
o = p;
} else {
div += c;
}
}
return(l);
}
void rle_expand(void *dst, void *src, int len)
{
__asm {
xor eax, eax
xor ecx, ecx
mov edx, len
mov ESI, src
mov EDI, dst
main_expand_loop:
lodsb
cmp AL, 0
jg copy_loop
neg AL
mov ECX, EAX
sub EDX, EAX
lodsb
rep stosb
and EDX, EDX
jnz main_expand_loop
copy_loop:
mov ECX, EAX
rep movsb
sub EDX, EAX
jnz main_expand_loop
}
/*
int c;
char *s,
*d;
d = (char*)ds;
s = (char*)sr;
while (len > 0) {
c = *s++;
if (c > 0) {
len -= c;
while (c--)
*d++ = *s++;
} else {
len += c;
while (c++)
*d++ = *s;
s++;
}
}
*/
}
void main(void)
{
int len;
printf("original: %s\n", orig);
len = rle_compress(comp,orig,31);
printf("compressed size: %d\n", len);
memset(orig,0,31);
rle_expand(orig,comp,31);
printf("expanded: %s\n", orig);
}
rle_comp.zip_fast rle_it
版权申诉
192 浏览量
2022-09-23
08:33:44
上传
评论
收藏 65KB ZIP 举报
weixin_42653672
- 粉丝: 93
- 资源: 1万+
最新资源
- 下载安装这个软件.apk
- 【数据集详细解释及案例分析】数据集详细解释及案例分析
- 基于SHT71温湿度传感器、STM32F103C8T6、LCD1602温湿度采集显示系统proteus仿真设计
- 基于TH02温湿度传感器、STM32F103C8T6、LCD1602、FREERTOS的温湿度采集系统proteus仿真设计
- 【TCP-IP协议详细解释及案例分析】TCP-IP协议详细解释及案例分析
- 一文搞懂 LSTM(长短期记忆网络).rar
- 【autosar简介及基本案例解析】autosar简介及基本案例解析
- java模拟斗地主洗牌发牌
- springboot+vue登录系统 vue部分
- 常用常见 SQL语句语法
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈