C字符串压缩算法
#include <iostream>
#include <stdlib.h>
//#include <algorithm> using namespace std; void stringZip( const char* pInputStr, long lInputLen, char* pOutputStr )
{
if( !pInputStr || lInputLen <= 1 || !pOutputStr )
return;
memset( pOutputStr, 0, lInputLen ); char cValue = *pInputStr;//重复字母对比值
long lCount = 0;//单一字符重复字母个数
int iIndex = 0;//pInputStr迭代位置
int iCur = 0;//pOutputStr当前指针偏移
int iNumLen = 0;//压缩字母的个数长度
char buf[16];//字母长度缓存 while( lInputLen-- )
{
if( cValue == *( pInputStr + iIndex++ ) )
{//遇到重复字符
lCount++;//
}
else
{
if( lCount > 1 )
{//重复字符
memset( buf, 0, 16 );
itoa( lCount, buf, 10 );
strcat( pOutputStr, buf );
iNumLen = strlen( buf );
} iCur += iNumLen;
*( pOutputStr + iCur ) = cValue;//append字符
iCur++; cValue = *(pInputStr + iIndex - 1);//取下一个待比较的字符 //重新计算位置
iIndex--;
lInputLen++; //重置计数器
iNumLen = 0;
lCount = 0;
}
}
} char* stringUnzip( const char* pStrIn )
{//
if( !pStrIn || !strlen( pStrIn ) )
return NULL; long lLen = strlen( pStrIn );
const int INCREMENT = 1024; //先将结果字符串设置为输入字符串的5倍大小
long lCurNums = 5 * lLen * sizeof( char );
char* pStrOut = (char*)malloc( lCurNums ); if( !pStrOut )
return NULL; memset( pStrOut, 0, lCurNums ); long lNum = 0;//重复字母个数
int iNumLen = 0;//重复字母长度
int iCur = 0;//结果集当前指针偏移
char numBuf[16];//用于计算数字长度
char cValue; //临时字符值
const long constLen = lLen;
long lIndex = constLen - lLen;//pStrIn的字符串偏移值 int i;
while( lIndex < constLen )
{
lIndex = constLen - lLen;// lNum = atoi( ( pStrIn + lIndex ));//字符个数 if( lNum > 0 )
{//字符个大于1
if( iCur + lNum >= lCurNums -1 )
{//空间不足
lCurNums += INCREMENT; pStrOut = (char*)realloc( pStrOut, lCurNums ); if( !pStrOut )
return NULL;
} memset( numBuf, 0, 16 );
itoa( lNum, numBuf, 10 ); iNumLen = strlen( numBuf );//取数字长度
cValue = *( pStrIn + lIndex + iNumLen );//取压缩的字符 for( i = 0; i < lNum; i++ )//还原压缩的字符
{
*( pStrOut + iCur++ ) = cValue;
} }
else
{//未压缩的单一字符
if( iCur >= lCurNums -1 )
{//空间不足
lCurNums += INCREMENT; pStrOut = (char*)realloc( pStrOut, lCurNums ); if( !pStrOut )
return NULL;
} *(pStrOut + iCur++ ) = *( pStrIn + lIndex + iNumLen );
} lLen = lLen - iNumLen - 1;//计算偏移值
iNumLen = 0; } return pStrOut; } int main( int argc, char* argv[] )
{
char* pInStr = "aaaabasdfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccccddddeeeadfaadfa";
int iLen = strlen( pInStr ) + 1; char* pOutStr = (char*)malloc( iLen );
memset( pOutStr, 0, iLen ); //压缩字符
stringZip( pInStr, iLen, pOutStr );
puts( pOutStr ); //还原压缩的字符
char* pUnzipStr = stringUnzip( pOutStr );
puts( pUnzipStr ); free( pUnzipStr );
pUnzipStr = NULL; return 0;
}
C字符串压缩算法的更多相关文章
- JustOj 1415: 字符串解压
题目描述 豆豆非常调皮,总喜欢把一样的东西摆在一起,然后用神奇的猫爪功把他们揉成一团. 比如一堆A,就会被揉成个数+A. 这就是豆豆的字符串压缩算法了. 比如给豆豆一个字符串:ABBCCCDDDDEE ...
- 字符串解压缩类库(zip、GZIP、QuickLz、snappy、lzf、jzlib)介绍
1.ZIP. GZIP 计算机文件压缩算法,JDK中java.util.zip.*中实现.主要包括ZipInputStream/ ZipOutputStream.GZipInputStream/Zi ...
- 字符串压缩(一)之ZSTD
前言 最近项目上有大量的字符串数据需要存储到内存,并且需要储存至一定时间,于是自然而然的想到了使用字符串压缩算法对"源串"进行压缩存储.由此触发了对一些优秀压缩算法的调研. 字符串 ...
- 深入剖析Redis RDN持久化机制
rdb是redis保存内存数据到磁盘数据的其中一种方式(另一种是AOF).Rdb的主要原理就是在某个时间点把内存中的所有数据的快照保存一份到磁盘上.在条件达到时通过fork一个子进程把内存中的数据写到 ...
- ZIP压缩算法详细分析及解压实例解释
最近自己实现了一个ZIP压缩数据的解压程序,觉得有必要把ZIP压缩格式进行一下详细总结,数据压缩是一门通信原理和计算机科学都会涉及到的学科,在通信原理中,一般称为信源编码,在计算机科学里,一般称为数据 ...
- .NET基础拾遗(3)字符串、集合和流
Index: (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基础 ...
- LZ77压缩算法编码原理详解(结合图片和简单代码)
前言 LZ77算法是无损压缩算法,由以色列人Abraham Lempel发表于1977年.LZ77是典型的基于字典的压缩算法,现在很多压缩技术都是基于LZ77.鉴于其在数据压缩领域的地位,本文将结合图 ...
- Java 压缩字符串
1.引言 最近在做项目中,平台提供一个http服务给其他系统调用,然后我接收到其他系统的json格式的报文后去解析,然后用拿到的数据去调用corba服务,我再把corba的返回值封装完成json字符串 ...
- C# 压缩与解压字符串(面试题)
/* * 题目:压缩字符串.如“abbcccddddeef”,压缩成“a1b2c3d4e2f1” * 解题: 这个题目也是面试常见的题目.看似很简单,其实暗藏杀机.一般的想法就是,一边遍历,一边计数, ...
随机推荐
- Android获取SharedPreferences失败,且App无法启动
说明: 一个app访问另外一个app的SharedPreferences,程序启动之后没有显示界面就卡死了,无任何提示信息. 错误原因: 应用调用createPackageContext失败,但是也不 ...
- git pull冲突解决
场景:用户UserA修改了文件File1,用户UserB也修改了文件File1并成功merge到了服务器上,而UserA和UserB改动了同一个代码块,当UserA拉取代码时git无法merge此改动 ...
- NiuTrans 日记 1
这些天把东北大学自然语言实验室的NiuTrans 系统搭建并按照例子将短语系统运行了一遍,写这个日记主要是为了以后能提醒自己在这其中遇到的问题. 环境:短语系统我是windows和linux都运行了, ...
- 【和我一起学python吧】Python解释执行原理
这里的解释执行是相对于编译执行而言的.我们都知道,使用C/C++之类的编译性语言编写的程序,是需要从源文件转换成计算机使用的机器语言,经过链接器链接之后形成了二进制的可执行文件.运行该程序的时候,就可 ...
- 关于FireFox下 CSS3 transition 与其他浏览器的差异
最近一个项目,动画效果全靠CSS3来做,用得比较多的transition,发现了一点火狐与其他浏览器的小差异. 首先我们写CSS的时候,一般为属性值为0的属性,我们一般会这样写 #id{ posito ...
- 用Intellij Idea创建简单的Servlet
Servlet作为Java服务端程序,使用起来还是挺方便的,下面是具体配置过程,我用的是Intellij Idea. 1. 做好必要准备,Intellij Idea(或者Eclipse for J2E ...
- TCL/Expect交互式自动化测试概要 - - ITeye技术网站
TCL/Expect交互式自动化测试概要 - - ITeye技术网站 expect是一种基于TCL,能与交互式程序进行"可程序化"会话的脚本语言,是一种可以提供"分支和嵌 ...
- 转载-清除Linux中MySQL的使用痕迹~/.mysql_history
原文地址:清除Linux中MySQL的使用痕迹~/.mysql_history 作者:RogerZhuo 原贴:http://bbs.chinaunix.net/thread-3676498-1-1. ...
- Merge Cells for DataGrid 合并单元格
只适合不分页的固定行列的表格 <script type="text/javascript"> function onLoadSuccess(data){ var mer ...
- 第二百九十五天 how can i 坚持
买了个小米电话卡,写的让周六日送,非得今天给送来,浪费了1块钱.买回来还没法激活,这.. 昨天差点挂掉,今天感觉好多了,不过今天好冷,回来快冻死了. 今天啊,年终奖订下来了,没有想象的高 啊,有点小失 ...