- 浏览: 49539 次
- 性别:
- 来自: 大同
最新评论
-
javafound:
不错,期待!
神奇的paint方法 -
为爱Debug:
依稀记得,以前为了考试背过!呵呵
java中错误与异常的总结 -
optimism_best:
楼主,你的样子吓到我了,阿门!
java中错误与异常的总结 -
TTNecro:
[size=x-small] 比预想的发表的晚很多啊!![/ ...
ACM赛后感想 -
javafound:
比较细致,呵呵,
java中错误与异常的总结
课程设计名称:差分法求数据压缩
题目:一数据文件中存放着若干个8位有符号数(补码),其相邻两数之间差值不超过-8至7。对这种变化缓慢的数据可采用差分方法进行压缩。即第一个数据不变,其后的数据取与前一数据的差值并用4位二进制补码表示,两个差值拼成一个字节,前一个差值放在高4位,后一个差值放在低4位。 例如: 原数据(X[n]):0x23,0x27,0x2A,0x29,0x22,…… 压缩后(Y[n]):0x23, 0x43, 0xF9 ,…… 1、编程按上述方法进行压缩,结果保存在另一文件中。 2、能够实现将压缩后的文件解压。
虽然是帮同学做一道题目,我还是认真分析了一下的。
首先,考虑测试用的文件。不能用UtraEditor去写16进制文件吧,况且我只知道它能以16进制方式显示文件内容……于是,我用内容为“abcdefghgfedcba”的文本文件作为测试文件。
其次,我分析了一下程序的基本流程。获取参数->读取文件->压缩/解压->写出文件。
在获取参数上,我考虑了两种方式。一种是直接用程序启动参数,在main函数参数列表里的。另一种是给用户提示信息,用户输入文件路径并回车确认输入。在使用第二种方式时我用到的C函数是char *fgets(char *s, int n, FILE *stream); 。
char input_file[256] = ""; // 定义保存文件路径的变量 printf("请输入文件路径:"); // 给出提示信息 fgets(input_file,256,stdin); // 读取控制台输入
其中stdin指控制台输入。这里还遇到一个问题,input_file获取的值需要trim操作,而C语言对字符传的操作米有trim函数。无奈,从网上拷了一个漂亮的实现。希望拷走的BODY同样用着愉快。
////////////////////////////////////////////////////// char* trim(char* desc,char* src,char* seps) { char* token=NULL; /* Establish string and get the first token: */ token = strtok(src, seps); while( token != NULL ) { /* While there are tokens in "string" */ strcat(desc,token); /* Get next token: */ token = strtok( NULL, seps ); } return desc; }
文件读写用到的C函数是
FILE *stream=fopen(const char *filepath, const char *op);
int i=fgetc(FILE *stream);
int fputc(int i, FILE *stream);
int fclose(FILE *stream);
加入输出缓冲后用到的C函数是
int fwrite(const void* buf, int size, int count, FILE *stream);
缓冲区的实现分为三个步骤:定义缓冲区数组->将数据放到缓冲区->判断缓冲区是否已满(满就输出)->最后判断缓冲区是否为空(空就输出)。
byte buffer[1024]; // 缓冲区 int index = 0; // 缓冲区下标 ...... buffer[index] = chout; // 将数据放入缓冲区 index++; // ditto if(1024 == index) { // 判断缓冲区是否已满 fwrite(buffer, 1024, 1, fpout); index = 0; // 清空缓冲区 } ...... if(index != 0) { // 判断缓冲区是否为空 fwrite(buffer, index, 1, fpout); }
这里需要注意的是,fwrite函数是针对内存操作的,一个int数组做缓冲区和一个byte数组做缓冲区是绝对不同的。虽然你写size=1;count=1024,但是对于int数组缓冲区来说只输出来256个数据。。。呵呵,这个地方真的很变态啊!!!
对于压缩和解压的算法实现上,我采用最保险的编程,尽量一行代码只操作一个变量。
// 压缩 int ch,chfollow,tmp,chout=5; fputc((ch = fgetc(fpin)), fpout); //第一个数据不变 long fs = filesize(fpin); fputc(fs%2, fpout); // 保存文件奇偶性 while((chfollow = fgetc(fpin)) != EOF) { tmp = chfollow - ch; // 计算差值 if(tmp<0) { // 将负差转化为正数 tmp = 8 + (8 - (0 - tmp)); } if(chout<8 && chout>0){ chout = tmp << 4; // 保存高位 }else{ chout += tmp; // 保存低位 printf("%d ", chout); // fputc(chout, fpout); buffer[index] = chout; index++; if(1024 == index) { fwrite(buffer, 1024, 1, fpout); index = 0; } chout = 5; } ch = chfollow; } if(chout>8 || chout==0) { printf("%d ", chout); // fputc(chout, fpout); buffer[index] = chout; index++; fwrite(buffer, index, 1, fpout); } else { if(index != 0) { fwrite(buffer, index, 1, fpout); } }
// 解压 int flag,ch,chfollow,tmp,chout=0; fputc((ch = fgetc(fpin)), fpout); // 第一个数据不变 flag = fgetc(fpin); // 数据奇偶性 while((chfollow = fgetc(fpin)) != EOF) { printf("%d ", chfollow); tmp = chfollow; chfollow = chfollow >> 4; // 还原前一个数据 chout = add(ch, chfollow); buffer[index] = chout; index++; tmp = tmp & 15; // 还原后一个数据 chout = add(chout, tmp); buffer[index] = chout; index++; if(1024 == index) { fwrite(buffer, 1024, 1, fpout); index = 0; } ch = chout; } if(index != 0) { fwrite(buffer, index, 1, fpout); } if(0 == flag) { // 根据奇偶性删除 fseek(fpout, -1, SEEK_CUR); fputc(EOF, fpout); }
对于源文件长度奇偶性的分析可用与解压时对最后一位数据做更加精准的还原,这里不细分析。。。。。。
啊啊啊啊啊啊,就此,复习了C的文件读写,将当时Java文件压缩的小项目用C实现了一哈,感脚良好……
- Projects.rar (27 KB)
- 下载次数: 10
发表评论
-
Log4j学习
2012-12-20 18:03 823这不是一篇细致的总结,只是几个零星的知识点。 L ... -
Java异常处理
2012-12-17 14:31 696正确关闭资源的方式: Object src ... -
Switch和for表达式细节
2012-12-09 11:09 753程序在其它地方使用enum值时,通常应该使用枚举名作为限定,即 ... -
访问一个类的静态field
2012-12-09 10:56 801当某个线程视图访问一个类的静态field时,根据该类的状态可能 ... -
多线程与同步
2012-12-08 21:10 727继承Thread类来创建线程类,重写run()方法作为线程执行 ... -
String对正则表达式的支持
2012-12-08 19:08 823支持正则表达式的方法: boolean matches ... -
泛型的类型擦除
2012-12-08 18:55 862当把一个具有泛型信息的对象赋给另一个没有泛型信息的变量时 ... -
System.identityHashCode(Object obj)
2012-12-08 16:16 1198System提供的identityHashCode()静 ... -
Java内存回收
2012-12-08 11:07 868基本上,可以把 JVM 内存中的对象引用理 ... -
Java集合框架
2012-12-06 15:27 786Java集合框架 HashMa ... -
Java内存分配
2012-11-30 23:44 752变量可大致分为局部变量和成员变量。局部变量分为形参、方法内的局 ... -
Java数组
2012-11-28 10:00 765小小的数组,知识还真不少! Java数组是静态的,与之 ... -
对云存储的一点认识
2012-05-26 15:28 1033云存储是在云计算概念上延伸和发展出来的一个新的概念。关于云 ... -
标准模板库STL
2012-03-10 23:48 1123STL 的最主要的两个特 ... -
为什么jquery的ajax事件不支持谷歌浏览器
2011-08-21 17:16 4995load方法是jquery中最方便实用的ajax实现,但是遇到 ... -
用Java实现信号量机制
2011-04-26 17:13 7337操作系统课上讲过,信号机制最开始是用无限循环实现的,信号量只是 ... -
继承的例子
2010-10-21 12:48 812最近学校留作业,因为用不惯NetBean,还是用JCreato ... -
JSP+Servlet的一些些编写方式
2010-10-14 11:05 8511.Servlet内处理自己要处理的错误 写法是: ret ... -
二分搜索递归实现代码中return的去留问题
2010-10-11 01:52 1258二分搜索有两种常见的实现方法:递归实现、迭代实现。其中递归实现 ... -
类之间的关系
2010-09-08 16:57 821这是本人系统学习设计模式之前的一篇记录类之间的关系的文章。 ...
相关推荐
针对当使用背景差分法时,背景存在突变和渐变、图像数据的冗余和伪前景对目标检测的干扰等问题,提出一种基于稀疏表示和字典学习的背景差分法。该方法首先训练视频流得到其数据字典,并根据数据字典学习与稀疏表示理论...
Newtonforward 求已知数据点的前向牛顿差分插值多项式 Newtonback 求已知数据点的后向牛顿差分插值多项式 Gauss 求已知数据点的高斯插值多项式 Hermite 求已知数据点的埃尔米特插值多项式 SubHermite 求已知数据点...
Newtonforward 求已知数据点的前向牛顿差分插值多项式 Newtonback 求已知数据点的后向牛顿差分插值多项式 Gauss 求已知数据点的高斯插值多项式 Hermite 求已知数据点的埃尔米特插值多项式 SubHermite 求已知数据点的...
图像压缩是数据压缩的一个子集,在医学领域起着至关重要的作用。 CT、MRI、PET 扫描和 X 射线图像等医学图像是海量数据,应进行压缩以方便存储容量,同时不丢失其详细信息,以便正确诊断患者。 现在,人工神经网络在...
它深入浅出地介绍了大量的算法及相关的数据结构,以及用于解决一些复杂计算问题的高级策略(如动态规划、贪心算法、平摊分析等),重点在于算法的分析和设计。对于每一个专题,作者都试图提供目前最新的研究成果及样例...
⼤数据预处理技术 学习了⽜琨⽼师的课程后整理的学习笔记,⽤于... 数量规约:⽤替代的、较⼩的数据表⽰形式替换原数据 具体⽅法包括:抽样和数据⽴⽅体聚集 数据压缩:⽆损压缩:能从压缩后的数据重构恢复原来的数据,
本设计结合FPGA自身的并行流水特性,对传统的帧间差分法进行改进,将前一帧从640×480×8bit的灰度图像通过2×2的窗口累加压缩为320×240×10bit的灰度图像作为缓存帧,在帧差过程中再重建展开用于运算,节省缓存帧图像...
5.2.4差分映射法 5.2.5四叉树编码 5.3拓扑关系的生成 5.3.1基本数据结构 5.3.2弧段的预处理 5.3.3结点匹配算法 5.3.4建立拓扑关系 思考题 第6章空间度量算法 6.1直线和距离 6.1.1直线 6.1.2直线...
利用三帧差分法检测出运动目标后,用改进的Camshifi算法对目标进行跟踪。从三个方面对Camshifl算法进行改进:只对目标的局部背景区域进行反向投影计算;计算目标与干扰区域的颜色相似系数,当系数大于阈值时,采用H...
3.3仿射变换3.4地图投影变换3.4.1概述3.4.2地球椭球体的相关公式...数据压缩算法5.2栅格数据的压缩5.2.1链式编码5.2.2游程长度编码5.2.3块式编码5.2.4差分映射法5.2.5四叉树编码5.3拓扑关系的生成...
前缀和与差分 双指针算法 位运算 离散化 区间合并 数据结构 —— 代码模板链接 常用代码模板2——数据结构 链表与邻接表:树与图的存储 栈与队列:单调队列、单调栈 kmp Trie 并查集 堆 Hash表 搜索与图论 —— ...
l 引 言时域有限差分法(Fnite Difference Time Domain,FDTD)是1966年K.S.Yee首先提出的一种以Maxwell方程为基础的解决电磁场问题的数值计算方法[1]。FDTD算法将Maxwell方程中的两个旋度方程直接转化为差分形式,...
前缀和与差分 双指针算法 位运算 离散化 区间合并 数据结构 —— 代码模板链接 常用代码模板2——数据结构 链表与邻接表:树与图的存储 栈与队列:单调队列、单调栈 kmp Trie 并查集 堆 Hash表 搜索与图论 —— ...
算法大全第16章_差分方程模型.pdf 算法大全第17章_马氏链模型.pdf 算法大全第18章_变分法模型.pdf 算法大全第19章_神经网络模型.pdf 算法大全第20章_偏微分方程的数值解.pdf 算法大全第21章_目标规划.pdf 算法大全第...
+ [差分约束系统](#差分约束系统) + [平面图](#平面图) + [2-SAT](#2-sat) + [最小生成树](#最小生成树) + [二分图](#二分图) + [Voronoi图](#voronoi图) + [偶图](#偶图) * [树](#树) + [树](#树-1) + ...
过滤式(filter):先对数据进行特征选择,然后在训练学习器,常见的方法有 Relief/方差选择发/相关系数法/卡方检验法/互信息法; 包裹式(wrapper):直接把最终将要使用的学习器的性能作为特征子集的评价准则,...
10.3 在除数不是2的幂时求带符号除法及余数 183 10.3.1 除以3 183 10.3.2 除以5 184 10.3.3 除以7 185 10.4 除数大于等于2的带符号除法 185 10.4.1 算法 187 10.4.2 算法可行性证明 187 10.4.3 证明乘积正确...
图论(图论模型的建立,平面图,欧拉公式与五色定理,求强连通分量,求割点和桥,欧拉回路,AOV问题,AOE问题,最小生成树的三种算法,最短路的三种算法,标号法,差分约束系统,验证二分图,Konig定理,匈牙利算法...