- 浏览: 51850 次
- 性别:
- 来自: 大同
最新评论
-
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 909这不是一篇细致的总结,只是几个零星的知识点。 L ... -
Java异常处理
2012-12-17 14:31 781正确关闭资源的方式: Object src ... -
Switch和for表达式细节
2012-12-09 11:09 850程序在其它地方使用enum值时,通常应该使用枚举名作为限定,即 ... -
访问一个类的静态field
2012-12-09 10:56 895当某个线程视图访问一个类的静态field时,根据该类的状态可能 ... -
多线程与同步
2012-12-08 21:10 809继承Thread类来创建线程类,重写run()方法作为线程执行 ... -
String对正则表达式的支持
2012-12-08 19:08 928支持正则表达式的方法: boolean matches ... -
泛型的类型擦除
2012-12-08 18:55 932当把一个具有泛型信息的对象赋给另一个没有泛型信息的变量时 ... -
System.identityHashCode(Object obj)
2012-12-08 16:16 1295System提供的identityHashCode()静 ... -
Java内存回收
2012-12-08 11:07 939基本上,可以把 JVM 内存中的对象引用理 ... -
Java集合框架
2012-12-06 15:27 860Java集合框架 HashMa ... -
Java内存分配
2012-11-30 23:44 833变量可大致分为局部变量和成员变量。局部变量分为形参、方法内的局 ... -
Java数组
2012-11-28 10:00 827小小的数组,知识还真不少! Java数组是静态的,与之 ... -
对云存储的一点认识
2012-05-26 15:28 1118云存储是在云计算概念上延伸和发展出来的一个新的概念。关于云 ... -
标准模板库STL
2012-03-10 23:48 1217STL 的最主要的两个特 ... -
为什么jquery的ajax事件不支持谷歌浏览器
2011-08-21 17:16 4995load方法是jquery中最方便实用的ajax实现,但是遇到 ... -
用Java实现信号量机制
2011-04-26 17:13 7387操作系统课上讲过,信号机制最开始是用无限循环实现的,信号量只是 ... -
继承的例子
2010-10-21 12:48 856最近学校留作业,因为用不惯NetBean,还是用JCreato ... -
JSP+Servlet的一些些编写方式
2010-10-14 11:05 9101.Servlet内处理自己要处理的错误 写法是: ret ... -
二分搜索递归实现代码中return的去留问题
2010-10-11 01:52 1368二分搜索有两种常见的实现方法:递归实现、迭代实现。其中递归实现 ... -
类之间的关系
2010-09-08 16:57 869这是本人系统学习设计模式之前的一篇记录类之间的关系的文章。 ...
相关推荐
在提供的压缩文件中,可能包含一个名为"1c7fa9f38deb438fa40fd030c14a38ea"的MATLAB脚本或数据文件,它可能是一个完整的有限差分法实现,或者包含用于进一步理解或运行此方法所需的数据和参数。如果你能访问这个文件...
本主题主要关注如何使用MATLAB编程实现雷诺方程的有限差分法求解。有限差分法是数值分析中的基本方法,用于将偏微分方程转化为代数方程组,从而实现对连续问题的离散化处理。 首先,让我们详细了解一下雷诺方程。...
在这个案例中,我们关注的是如何运用有限差分法来解决可压缩纳维-斯托克斯方程(Compressible Navier-Stokes Equations),这是一个描述流体动态行为的基本方程组。"compressible-rayleigh-taylor-instability-...
综上所述,垂距法和偏角法都是针对序列数据的无损压缩方法,它们在C语言中通过计算差分或角度来实现数据压缩。`DATAYASU.c`和`DATAYASU2.c`是两个实现这些算法的源代码文件,而`ys1.txt`则提供了测试数据,用于验证...
有限差分法是一种数值方法,用于求解偏微分方程。它通过将连续区域离散化成网格点,然后用点上的函数值来近似微分方程的解。在欧拉方程的情况下,我们可以对每个点的物理量(如速度、压力和密度)进行时间步长和空间...
【标题】:“matlab背景差分法.zip”指的是一个包含MATLAB实现的背景差分算法的压缩文件。背景差分法是一种计算机视觉技术,常用于视频处理和监控领域,用于检测场景中的运动物体。 【描述】:这个描述简单直接,...
在计算机视觉领域,车流量检测是一项重要的应用,它通常用于交通监控、城市规划以及智能交通...通过背景差分法和邻帧检测法的结合,可以有效地检测和跟踪视频中的车辆,为交通管理和智能交通系统提供有价值的数据支持。
基于MATLAB实现的有限差分法实验报告用MATLAB中的有限差分法计算槽内电位;对比解析法和数值法的异同点;选取一点,绘制收敛曲线;总的三维电位图+使用说明文档 1、代码压缩包内容 主函数:main.m; 调用函数:其他m...
LZ77和LZ78是两种无损数据压缩算法,属于滑动窗口法。LZ77查找源数据中的最长匹配前缀,并用前缀长度和偏移量来代替,而LZ78则是基于词典的编码,每次添加一个新的词汇到词典中。这两种方法在压缩不规则的数据流时...
"Consolidate 单向固结差分法程序"是为了解决这个问题而设计的一种软件工具,它利用了单向固结理论,并通过Microsoft Foundation Classes (MFC)库来实现用户界面和数据处理。 单向固结理论是土力学的一个基本概念,...
而对于非均匀地层或其他复杂的边界条件,差分法仍然可以适应并求出固结方程的解,只需适当调整初始和边界条件即可。 ### 关键词总结 关键词包括:太沙基(Terzaghi)、固结(consolidation)、差分计算...
根据具体的实现方式,差分图像法主要分为两类:背景差分法和帧间差分法。 #### 1 背景差分法 背景差分法的基本思想是将当前帧与一个静态背景模板进行对比,从而识别出运动的对象。但是,在实际应用中,这种方法...
标题中的“12 steps to N-S.zip_12 steps N–S_2维流动_steps_有限差分法_流动方程”指的是一个关于求解二维Navier-Stokes(N-S)方程的教程,该教程可能包含12个步骤,通过有限差分法对流动问题进行数值模拟。...
针对当使用背景差分法时,背景存在突变和渐变、图像数据的冗余和伪前景对目标检测的干扰等问题,提出一种基于稀疏表示和字典学习的背景差分法。该方法首先训练视频流得到其数据字典,并根据数据字典学习与稀疏表示理论...
"声波方程有限差分正演模拟"是解决声波方程的一种数值方法,即有限差分法。这种方法将连续的空间和时间域离散化为网格,然后利用差分公式近似导数,进而求解方程。正演模拟是指根据已知的地下物理参数(如速度、密度...
基于MATLAB实现的有限元差分法求解一维电磁场的MATLAB程序,该程序给出了电磁场随时间的演化图+使用说明文档.rar 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行...
综上所述,"基于差分的可逆水印算法源程序"是一个实现版权保护和数据安全的工具,它利用MATLAB强大的图像处理能力,实现了在不影响原始数据质量的前提下,有效地隐藏和提取水印信息。通过对差分技术的运用,该算法...
基于MATLAB实现的有限差分法数值模拟弹性波动方程+使用说明文档.rar 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2020b;若运行有误,根据提示GPT...
Newtonforward 求已知数据点的前向牛顿差分插值多项式 Newtonback 求已知数据点的后向牛顿差分插值多项式 Gauss 求已知数据点的高斯插值多项式 Hermite 求已知数据点的埃尔米特插值多项式 SubHermite 求已知数据点...