利用Huffman算法对RINEX格式GPS观测文件进行压缩

合集下载

数据压缩算法在卫星遥感数据处理中的应用技巧(九)

数据压缩算法在卫星遥感数据处理中的应用技巧(九)

数据压缩算法在卫星遥感数据处理中的应用技巧概述:卫星遥感数据处理是现代地质、气象、环境等领域研究的重要手段之一,数据压缩算法在该过程中起着关键作用。

本文将探讨数据压缩算法在卫星遥感数据处理中的应用技巧。

一、压缩算法的意义卫星遥感数据获取的过程中,数据量庞大,给数据传输和存储带来了巨大的困扰。

数据压缩算法可以有效地减小数据量,提高数据传输和存储的效率。

因此,研究和应用数据压缩算法具有重要的意义。

二、无损压缩与有损压缩数据压缩算法可以分为无损压缩和有损压缩,根据需求选择合适的压缩算法非常重要。

1. 无损压缩无损压缩算法通过减小数据的冗余度来实现数据压缩,实现压缩的同时完全保留数据的原始信息。

这种算法适用于对数据的精确保留要求比较高的场景。

例如,卫星遥感图像中的一些重要细节需要完整地保留下来,此时可以选择无损压缩算法。

2. 有损压缩有损压缩算法通过舍弃部分数据的细节信息,实现压缩效果。

虽然会导致数据的一定程度的质量损失,但对于某些应用场景来说,这种信息损失是可以接受的。

例如,对于某些卫星遥感图像中的细节部分,可以采用有损压缩算法,减小数据量的同时满足数据传输和存储的需求。

三、常用的压缩算法在卫星遥感数据处理中,常用的压缩算法有很多,下面我们介绍几种常见的压缩算法。

1. Huffman压缩算法Huffman压缩算法是一种典型的无损压缩算法,通过统计数据中各个符号出现的频率,根据频率来给不同的符号编码。

频率较高的符号用较短的编码表示,频率较低的符号用较长的编码表示。

这种算法适用于对数据中符号的频率分布进行压缩的场景。

2. 等长编码压缩算法等长编码压缩算法是一种无损压缩算法,该算法将数据划分为等长的数据块,然后将每个数据块映射到一个二进制码。

这种算法适用于对数据分段进行压缩的场景。

3. DCT压缩算法离散余弦变换(DCT)是一种常用的有损压缩算法,该算法通过将数据转换为频域,将低频部分保留下来,剔除高频细节以达到压缩的目的。

GPS定位数据压缩算法的设计

GPS定位数据压缩算法的设计

GPS定位数据压缩算法的设计
任华新
【期刊名称】《长春工程学院学报(自然科学版)》
【年(卷),期】2008(009)003
【摘要】为了解决嵌入式GPS车载系统存储空间小、GPS定位数据量大的矛盾,根据GPS定位数据的特点,提出用动态Huffman算法对GPS信号进行压缩.该算法是一种Huffman算法的基础上改进的算法,为车载系统节省了大量的存储资源.除此之外,也缩短了GSM信道的占用时间,缓解了向控制调度中心上传数据的压力.【总页数】3页(P74-76)
【作者】任华新
【作者单位】辽宁对外经贸学院,大连,116052
【正文语种】中文
【中图分类】TP306
【相关文献】
1.数据采集系统中的数据压缩算法设计 [J], 娄华平;孙运强;姚爱琴
2.基于SRWF -1028的GPS定位数据传输系统的设计 [J], 赵敏;李锦明;马游春;王向玲
3.GPS定位数据压缩算法的设计与实现 [J], 杨宏业;张跃
4.GPS定位数据采集器的设计与实现 [J], 吴定雪;范文萍
5.GPS定位数据的提取与存储系统的设计 [J], 鲍萍萍;陈光;王朋;王鹏辉
因版权原因,仅展示原文概要,查看原文内容请购买。

Huffman的应用之文件压缩与解压缩

Huffman的应用之文件压缩与解压缩

Huffman的应用之文件压缩与解压缩最近这段时间一直在学习树的这种数据结构,也接触到了Huffman树以及了解了什仫是Huffman编码,而我们常用的zip压缩也是利用的Huffman编码的特性,那仫是不是可以自己实现一个文件压缩呢?当然可以了.在文件压缩中我实现了Huffman树和建堆Heap的代码,zip压缩的介绍>下面开始介绍自己实现的文件压缩的思路和问题...1).统计>读取一个文件统计这个文件中字符出现的次数.2).建树>以字符出现的次数作为权值使用贪心算法构建Huffman树(根据Huffman树的特性>字符出现次数多的一定靠近根结点,出现次数少的一定远离根结点).3).生成Huffman编码>规则左0右1.4).压缩>再次读取文件,根据生成的Huffman编码压缩文件.5).生成配置文件>将字符以及字符出现的次数写进配置文件中.6).解压缩>利用配置文件还原出Huffman树,根据压缩文件还原出原文件.7).测试>判断解压是否正确需要判断原文件和解压缩之后的文件是否相同,利用Beyond Compare软件进行对比.下面是我举的一个简单的范例,模拟压缩和解压缩的过程,希望有读者有帮助利用Beyond Compare软件进行对比>在实现中出现了很多的问题,下面我提出几个容易犯的问题,仅供参考1).在使用贪心算法构建Huffman树的时候,如果我们以unsigned char一个字节来存储它总共有2^8=256个字符,如果将所有的字符都构建Huffman树,这不仅降低了效率还将分配极大的内存.所以我设立了非法值这个概念,只有当字符出现的次数不为0的时候才将该字符构建到Huffman树中.2).在写压缩文件的时候我们是将字符对应的Huffman编码转化为对应的位,每当填满一个字节(8位)后再写入压缩文件中.如果最后一个字节没有填满我们就将已经填的位移位空出后几个位置,将未满的位置补0补满一个字节再写入压缩文件中.3).如果我们将源文件压缩之后再去解压,因为你的Huffman树和Huffman编码都是在压缩函数中得到的,此时再去解压那仫你的Huffman编码以及不存在了该如何去还原文件呢?这就是为什仫要生成配置文件的原因了,在配置文件中写入了字符以及字符出现的次数.在解压缩中根据配置文件构建新的Huffman树.4).由压缩文件还原文件的时候如何知道压了多少个字符呢?也就是说因为我们在压缩的时候最后一个字节是补了0的在解压缩的时候可能会把这个补的位当成字符的编码来处理.一种想法是在统计字符出现的次数的时候设置一个变量,每读取一个字符该变量就加1,最后将该变量写进配置文件中.另外一种想法就是根据根结点的权值,通过上述简单的实例观察可知根结点权值中的_count就是字符出现的次数.解决了以上几个问题,我的程序已经可以压缩那256个字符并正确的还原了,那仫如果是大文件或者是汉字,图片以及音频视频呢?1).因为有些特殊的字符编码,所以我们统计字符出现的次数的时候应该用的是unsigned char,刚开始我用的文件结束标志是EOF在ASII中它的编码是-1此时已经不可以用EOF来判断是否文件结束了,所以我用了feof这个函数来判断文件是否结束.2).统计字符出现次数应该用的类型是long long,这就解决了大文件的压缩和解压缩的问题了.3).因为汉字,图片,视频这些在内存中是以二进制的形式存在的,所以我们将以文本形式打开读或者写的修改为以二进制的形式读或者写.为了验证大文件的压缩我找了一个8.09M的文件压缩之后是6.50M,并且可以正确还原.1).测试效率>2).利用Beyond Compare软件进行对比,如果一样说明压缩成功>[cpp] view plain copy print?在CODE上查看代码片派生到我的代码片#define _CRT_SECURE_NO_W ARNINGS 1#pragma once#include "Heap.h"template<class T>struct HuffmanTreeNode{T _weight;HuffmanTreeNode<T> *_left;HuffmanTreeNode<T> *_right;HuffmanTreeNode<T> *_parent;HuffmanTreeNode(const T& w=T()):_weight(w),_left(NULL),_right(NULL),_parent(NULL){}};template<class T>class HuffmanTree{typedef HuffmanTreeNode<T> Node;public:HuffmanTree():_root(NULL){}HuffmanTree(const T* a,size_t size):_root(NULL){_root=_CreatHuffmanTree(a,size);}//将未出现的字符过滤出来,不构造堆HuffmanTree(const T* a,size_t size,const T& invalid){_root=_CreatHuffmanTree(a,size,invalid);}Node* GetRoot(){return _root;}~HuffmanTree(){_Destroy(_root);}protected:Node *_CreatHuffmanTree(const T* a,size_t size){struct NodeLess{bool operator()(Node *l,Node *r)const{return l->_weight < r->_weight;}};Heap<Node *,NodeLess> minHeap;//建立结点并放入vector中for (size_t i=0;i<size;++i){Node *tmp=new Node(a[i]);minHeap.Push(tmp);}//取出较小的两个结点作为左右孩子并构建父结点while (minHeap.Size() > 1){Node *left=minHeap.Top();minHeap.Pop();Node *right=minHeap.Top();minHeap.Pop();Node *parent=new Node(left->_weight + right->_weight);parent->_left=left;parent->_right=right;left->_parent=parent;right->_parent=parent;minHeap.Push(parent);}return minHeap.Top();}//思路类似不带过滤功能的Node *_CreatHuffmanTree(const T* a,size_t size,const T& invalid) {struct NodeLess{bool operator()(Node *l,Node *r)const{return l->_weight < r->_weight;}};Heap<Node *,NodeLess> minHeap;//建立结点并放入vector中for (size_t i=0;i<size;++i){if(a[i] != invalid){Node *tmp=new Node(a[i]);minHeap.Push(tmp);}}//取出较小的两个结点作为左右孩子并构建父结点while (minHeap.Size() > 1){Node *left=minHeap.Top();minHeap.Pop();Node *right=minHeap.Top();minHeap.Pop();Node *parent=new Node(left->_weight + right->_weight);parent->_left=left;parent->_right=right;left->_parent=parent;right->_parent=parent;minHeap.Push(parent);}return minHeap.Top();}void _Destroy(Node *&root)if(root == NULL)return ;Node *cur=root;if(cur){_Destroy(cur->_left);_Destroy(cur->_right);delete cur;cur=NULL;return ;}}protected:Node *_root;};void testHuffmanTree(){int a[]={0,1,2,3,4,5,6,7,8,9};int size=sizeof(a)/sizeof(a[0]);HuffmanTree<int> ht(a,size);}[cpp] view plain copy print?在CODE上查看代码片派生到我的代码片#define _CRT_SECURE_NO_W ARNINGS 1#pragma once//利用仿函数的特性实现代码的复用性template<class T>struct Small{bool operator()(const T& l,const T& r){return l < r;}};template<class T>struct Large{bool operator()(const T& l,const T& r)return l > r;}};template<class T,class Compare=Large<T>> //缺省是建小堆class Heap{public:Heap(){}Heap(const T *a,int size){assert(a);_a.reserve(size);for (int i=0;i<size;++i){_a.push_back(a[i]);}//建堆的时候从倒数第一个非叶子结点开始.for (int j=(size-2)/2;j>=0;--j){_AdjustDown(j);}}void Push(const T& x){_a.push_back(x);_AdjustUp(_a.size()-1);}void Pop(){assert(!_a.empty());swap(_a[0],_a[_a.size()-1]);_a.pop_back();_AdjustDown(0);}size_t Size(){return _a.size();}bool Empty(){return _a.empty();const T& Top()const{assert(!_a.empty());return _a[0];}void Display(){for (size_t i=0;i<_a.size();++i){cout<<_a[i]<<" ";}cout<<endl;}protected:void _AdjustDown(int root){int parent=root;size_t child=2*root+1;while (child < _a.size()){Compare com;//child指向左右孩子中较大的那个数//if (child+1 < _a.size()// && _a[child+1] > _a[child])if(child+1 < _a.size()&& com(_a[child+1],_a[child])){child++;}//if (_a[child] > _a[parent])if(com(_a[child],_a[parent])){swap(_a[child],_a[parent]);parent=child;//初始的child默认指向左孩子child=2*parent+1;}elsebreak;}}void _AdjustUp(int child){while (child > 0){int parent=(child-1)/2;Compare com;//if (_a[child] > _a[parent])if(com(_a[child],_a[parent])){swap(_a[child],_a[parent]);child=parent;}else//插入的数据比父节点的数据域小break;}}protected:vector<T> _a;};//利用堆解决优先级队列的问题template<class T,class Compare=Large<T>>class PriorityQueue{public:PriorityQueue(int *a,int size):_pq(a,size){}void Push(const T& x){_pq.Push(x);}void Pop(){_pq.Pop();}const T& Top()const{return _pq.Top();}void Display(){_pq.Display();}protected:Heap<T,Compare> _pq;};[cpp] view plain copy print?在CODE上查看代码片派生到我的代码片#define _CRT_SECURE_NO_W ARNINGS 1#pragma once#include "HuffmanTree.h"typedef long long Type;struct CharInfo{unsigned char _ch; //出现的字符Type _count; //统计次数string _code; //Huffman编码CharInfo(Type count=0):_ch(0),_count(count),_code(""){}//重载对应的操作符CharInfo operator + (const CharInfo& fc)const{return CharInfo(_count + fc._count);}bool operator != (const CharInfo fc)const{return _count != fc._count;}bool operator < (const CharInfo& fc)const{return _count < fc._count;}};class FileCompress{public://默认的构造函数FileCompress(){for(size_t i=0;i<256;++i){_infos[i]._ch=i;}}string Compress(const char *filename){assert(filename);FILE *pf=fopen(filename,"rb");assert(pf);unsigned char ch=fgetc(pf);//统计字符出现的次数while (!feof(pf)){_infos[ch]._count++;ch=fgetc(pf);}//以该字符出现的次数构建一颗HuffmanTree.CharInfo invalid; //非法值HuffmanTree<CharInfo> ht(_infos,256,invalid);//生成Huffman编码string code;_CreatHuffmanCode(ht.GetRoot(),code);//_CreatHuffmanCode(ht.GetRoot());//压缩文件fseek(pf,0,SEEK_SET); //回到文件头string compressfile=filename;compressfile += ".compress"; //压缩后的文件名FILE *fin=fopen(compressfile.c_str(),"wb");assert(fin);size_t pos=0; //记录位数unsigned char value=0;ch=fgetc(pf);while (!feof(pf)){string &code=_infos[ch]._code;for (size_t i=0;i<code.size();++i){value <<= 1;if(code[i] == '1')value |= 1;elsevalue |= 0; //do-nothing++pos;if(pos == 8) //满一个字节{fputc(value,fin);value=0;pos=0;}}ch=fgetc(pf);}if(pos) //解决不足8位的情况.{value <<= (8-pos);fputc(value,fin);}//配置文件--便于重建Huffman树string ename=filename;configfilename += ".config";FILE *finconfig=fopen(configfilename.c_str(),"wb");assert(finconfig);string line;char buff[128];for (size_t i=0;i<256;++i){//一行一行的读if (_infos[i]._count){line += _infos[i]._ch;line += ",";line += _itoa(_infos[i]._count,buff,10);line += "\n";//fputs(line.c_str(),finconfig);fwrite(line.c_str(),1,line.size(),finconfig);line.clear();}}fclose(pf);fclose(fin);fclose(finconfig);return compressfile;}string UnCompress(const char *filename){assert(filename);string configfilename=filename;size_t index=configfilename.rfind(".");configfilename=configfilename.substr(0,index); configfilename += ".config";FILE *foutconfig=fopen(configfilename.c_str(),"rb"); assert(foutconfig);string line;//读取配置文件--获取字符出现的次数unsigned char ch=0;while (ReadLine(foutconfig,line)){if(line.empty()){line += '\n';continue;}//读到空行ch=line[0];_infos[ch]._count = atoi(line.substr(2).c_str());line.clear();}//构建Huffman树CharInfo invalid;HuffmanTree<CharInfo> hft(_infos,256,invalid);//根结点的权值也就是字符出现的次数总和HuffmanTreeNode<CharInfo> *root=hft.GetRoot(); Type charcount=root->_weight._count;//解压缩string uncompressfilename=filename;index=uncompressfilename.rfind("."); uncompressfilename=uncompressfilename.substr(0,index); uncompressfilename += ".uncompress";FILE *fin=fopen(uncompressfilename.c_str(),"wb"); assert(fin);//由压缩文件还原文件string compressfilename=filename;FILE *fout=fopen(compressfilename.c_str(),"rb");assert(fout);HuffmanTreeNode<CharInfo> *cur=root;int pos=7;ch=fgetc(fout);while (charcount > 0){while (cur){if(cur->_left == NULL && cur->_right == NULL){//叶子结点fputc(cur->_weight._ch,fin);cur=root;--charcount;if (charcount == 0) //所有的字符都处理完成break;}if (ch & (1 << pos)) //检查字符的每个位cur=cur->_right; //1向右走elsecur=cur->_left; //0向左走--pos;if(pos < 0) //一个字节解压完成{ch=fgetc(fout);pos=7;}}}fclose(foutconfig);fclose(fin);fclose(fout);return uncompressfilename;}//读取一行字符并放在line中bool ReadLine(FILE *fout,string& line){int ch=fgetc(fout);if(ch == EOF)return false;while (ch != EOF && ch != '\n'){line += ch;ch=fgetc(fout);}return true;}protected://递归的方法求HuffmanTreeCodevoid _CreatHuffmanCode(HuffmanTreeNode<CharInfo> *root,string &code) {if(root == NULL)return ;_CreatHuffmanCode(root->_left,code+'0');_CreatHuffmanCode(root->_right,code+'1');if(root->_left == NULL && root->_right == NULL) //叶子结点{_infos[root->_weight._ch]._code=code;}}//非递归求HuffmanTreeCodevoid _CreatHuffmanCode(HuffmanTreeNode<CharInfo> *root){if(root == NULL)return ;_CreatHuffmanCode(root->_left);_CreatHuffmanCode(root->_right);if(root->_left == NULL && root->_right == NULL) //叶子结点{string& code=_infos[root->_weight._ch]._code;HuffmanTreeNode<CharInfo> *cur=root;HuffmanTreeNode<CharInfo> *parent=root->_parent;while (parent){if(parent->_left == cur)code.push_back('0'); //左0elsecode.push_back('1'); //右1cur=parent;parent=cur->_parent;}//编码是从根到叶子结点的,需要逆置reverse(code.begin(),code.end());}}protected:CharInfo _infos[256];};void testFileCompress(){FileCompress fc;cout<<"开始压缩"<<endl;cout<<"压缩用时:";int start=GetTickCount();press("2.png"); //input input.BIG 3.mp3int end=GetTickCount();cout<<end-start<<endl;cout<<"开始解压"<<endl;cout<<"解缩用时:";start=GetTickCount();fc.UnCompress("press"); //press press 3.mp3end=GetTickCount();cout<<end-start<<endl;}void testFileUncompress(){FileCompress fc;cout<<"开始解压"<<endl;cout<<"解缩用时:";int start=GetTickCount();fc.UnCompress("2.png");int end=GetTickCount();cout<<end-start<<endl;}经过测试这个小项目已经可以压缩并还原一些文件了,目前还没有发现什仫大的Bug,如果有童鞋发现请第一时间告诉我哦...。

GPS数据预处理RINEX格式验证及标准化

GPS数据预处理RINEX格式验证及标准化

&sup2; 执行后,输出验证信息;
命令为:
teqc +v source.**o
teqc +v source1.**o source2.**o source3.**o
验证同类型多个文件的格式时,后面文件的时间标示要在前面文件的后面,否则给出提示:
E:\TEQC>teqc +v test.03o temp.txt
(current epoch preceeds last epoch) ... exiting
2.3文件头的编辑和提取
命令为:
teqc –O.mo monument source.**o >result.**o
将source.**o文件中的点名改为monument,输出文件为result.**o
O文件头部分常用的设置有:
–O.rn: 点名
–O.mn: 测站编号
-O.at: 天线类型
-O.an: 天线编号
-O.rt: 接收机类型
//注意:IGS标准约定:接收机类型共20位,格式为:“仪器公司名+space+模型名”eg:“TPS HIPER-GD”。而TEQC命令行中是不能连续出现非参数选项,则修改接收机类型时要加引号:
teqc –O.rt “TPS HIPER-GD” source.**o > result.**o
-O.int: 采样率间隔
+O.c: 追加注释行记录
3.QC (Quality Check) 质量检核
质量检核有2种模式:lite模式和full模式。
3.1 lite模式需要的文件是:O文件。
**.ion L1-L2电离层延迟;

哈夫曼编码的压缩与解压缩

哈夫曼编码的压缩与解压缩

哈夫曼编码的压缩与解压缩1.引言1.1 概述哈夫曼编码是一种常用的数据压缩算法,它采用了一种变长编码方式,将出现频率高的字符用较短的编码表示,出现频率低的字符用较长的编码表示,以达到压缩数据的目的。

该编码方法由美国数学家大卫·哈夫曼于1952年提出,被广泛应用于各种数据压缩和传输领域。

在传统的固定长度编码中,每个字符都使用相同的位数来表示,因此在表示不同概率出现的字符时,可能会浪费大量的位数。

而哈夫曼编码则是根据字符在文本中出现的频率来确定其对应的编码,使得高频出现的字符用更短的编码表示,低频出现的字符用较长的编码表示。

哈夫曼编码的核心思想是构建一棵哈夫曼树,将出现频率作为权值,频率越高的字符离根节点越近。

通过从叶子节点到根节点的路径确定每个字符的编码,即将左子树标记为0,右子树标记为1。

在对文本进行压缩时,将文本中的字符转换为其对应的哈夫曼编码,即可将原始数据压缩为较短的二进制串。

相比于传统固定长度编码,哈夫曼编码具有显著的优势。

首先,它可以根据文本中字符出现的实际情况进行编码,使得频率高的字符用较短的编码表示,从而大幅度减少了编码后的数据长度。

其次,哈夫曼编码是一种前缀编码,即任何一个字符的编码都不是其他字符编码的前缀,这样在解码时可以直接根据编码找到对应的字符,无需回溯查表,提高了解码效率。

哈夫曼编码的应用广泛,它被用于无损图像压缩、音频压缩、文本压缩等领域。

随着互联网和大数据时代的到来,数据的传输和存储成为重要的问题,如何高效地压缩和解压缩数据成为一个热门的研究方向。

哈夫曼编码作为一种简单而有效的压缩算法,具有广阔的应用前景。

然而,哈夫曼编码也存在一些问题,如编码时需要构建哈夫曼树,需要额外的空间和时间开销,对于小规模数据可能会影响压缩效率。

因此,在实际应用中,需要综合考虑数据规模和应用场景,选择合适的压缩算法。

1.2 文章结构本文主要介绍了哈夫曼编码的压缩与解压缩。

文章分为引言、正文和结论三个部分。

用哈夫曼编码实现文件压缩.doc

用哈夫曼编码实现文件压缩.doc

《用哈夫曼编码实现文件压缩》实验报告课程名称数据结构(B)实验学期2009 至2010 学年第 1 学期学生所在系部计算机系年级2007 专业班级计算机B071学生姓名陆永芳学号200707014105任课教师盛建瓴实验成绩用哈夫曼编码实现文件压缩1、了解文件的概念。

2、掌握线性链表的插入、删除等算法。

3、掌握Huffman树的概念及构造方法。

4、掌握二叉树的存储结构及遍历算法。

5、利用Huffman树及Huffman编码,掌握实现文件压缩的一般原理。

微型计算机、Windows 系列操作系统、Visual C++6.0软件根据ascii码文件中各ascii字符出现的频率情况创建Haffman树,再将各字符对应的哈夫曼编码写入文件中,实现文件压缩。

本次实验采用将字符用长度尽可能短的二进制数位表示方法,即对于文件中出现的字符,无须全部都用8位的ASCII码进行存储,根据他们在文件中出现色频率不同,我们利用Haffman算法使每个字符都能以最短的二进制字符进行存储,以达到节省存储空间,压缩文件的目的。

解决了压缩需采用的算法,程序的思路就清晰了:1.统计需压缩文件中每个字符出现的频率2.将每个字符的出现频率作为叶子结点构建Haffman树,然后将树中结点引向其左孩子的分支标“0”,引向其右孩子的分支标“1”;每个字符的编码即为从根到每个叶子的路径得到0、1的序列,这样便能完成了Haffman的编码,将每个字符用最短的二进制字符表示。

3.打开需压缩文件,再将需压缩文件中的每个ascii码对应的Haffman编码按bit单位输出。

4.文件压缩结束。

(1)构造Huffman树的方法——Haffman算法构造Huffman树步骤:I.根据给定的n个权值{w1,w2,……,wn},构造n棵只有根结点的二叉树,令起权值为wj。

II.在森林中选取两棵根结点权值最小的树作为左右子树,构造一棵新的二叉树,置新二叉树根结点权值为其左右子树根结点权值之和。

Huffman的应用之文件压缩与解压缩汇总

Huffman的应用之文件压缩与解压缩汇总
解决了以上几个问题,我的程序已经可以压缩那256个字符并正确的还原了,那仫如果是大文件或者是汉字,图片以及音频视频呢?
1).因为有些特殊的字符编码,所以我们统计字符出现的次数的时候应该用的是unsigned char,刚开始我用的文件结束标志是EOF在ASII中它的编码是-1此时已经不可以用EOF来判断是否文件结束了,所以我用了feof这个函数来判断文件是否结束.
template<class T>
struct HuffmanTreeNode
{
T _weight;
HuffmanTreeNode<T> *_left;
HuffmanTreeNode<T> *_right;
HuffmanTreeNode<T> *_parent;
HuffmanTreeNode(const T& w=T())
Huffman的应用之文件压缩与解压缩
最近这段时间一直在学习树的这种数据结构,也接触到了Huffman树以及了解了什仫是Huffman编码,而我们常用的zip压缩也是利用的Huffman编码的特性,那仫是不是可以自己实现一个文件压缩呢?当然可以了.在文件压缩中我实现了Huffman树和建堆Heap的代码,zip压缩的介绍>
{}
HuffmanTree(const T* a,size_t size)
:_root(NULL)
{
_root=_CreatHuffmanTree(a,size);
}
//将未出现的字符过滤出来,不构造堆
HuffmanTree(const T* a,size_t size,const T& invalid)
下面是我举的一个简单的范例,模拟压缩和解压缩的过程,希望有读者有帮助

GPS数据文件通用格式(rinex)转换

GPS数据文件通用格式(rinex)转换

RINEX数据格式(一)文章分类:综合技术由于GPS 接收机类型多种多样, GPS 原始数据的数据处理是非常繁重而复杂的。

RINEX 是英文“Receiver Independent Exchange Format”(接收机通用数据交换格式) 的缩写形式。

为使GPS数据处理软件通用化, 同时验证所用算法的可行性, GPS数据需要首先转换为RINEX标准格式, 然后再设计与编制所需软件。

在这种方式下, 一种软件能处理多种类型的GPS接收机所采集的数据。

美国德克萨斯大学应用研究实验室早期提出了一种标准的FICA文档格式,它的设计原则是尽可能保持接收机所收集数据的原始特征, 只将该数据的二进制码逐个转换为计算机的ASCII 码, 对数据本身不作任何处理。

显然, 这种格式对数据库是理想的, 但对大量信息的存储和调用是繁杂的。

此格式曾经用于CIGNET计划中。

此后, 美国大地测量局开发了ARGO格式。

它将不同型号接收机收集的数据重新进行格式化, 完全符合CIGNET计划的应用。

但这种格式固定不变, 很难插入其它信息。

1989 年, 瑞士伯尔尼大学天文研究所为用于EUREF 计划, 提出了RINEX 格式草案。

1989年3月, 在美国新墨西哥州举行的第五届国际卫星定位大地测量学术讨论会上, 成立了GPS交换格式的专题研究机构, 讨论了各种数据交换格式的差异。

经过讨论决定, 形成了RINEX (版本1.0) 数据交换格式。

1989 年8月在英国爱丁堡举行的国际大地测量协会上, RINEX格式被推荐为通用的测量GPS数据的标准交换格式。

在随后一年半的应用中, RINEX 被证明为GPS数据交换的一种有效途径。

1990年9月5日, 在加拿大渥太华举行的第二届国际GPS精密定位学术讨论会上, 提出了RINEX 格式(版本2.0) 的建议。

最后一次定稿是1993年3月在瑞士伯尔尼举行的IGS地球动力学学术讨论会上通过的。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

摘 要 针 对 RI NEX 格 式 的 GP S观 测 数 据 文 件 , 现 了利 用 Hu f n 算 法 进 行 数 据 压 缩 的 软 件 编 制 并 进 行 了 成 实 f ma 功 的 试 验 , 据 压 缩 的 比 率 在 4 ~ 5 之 间 . 于 一 般 压 缩 工 具 如 W iz 、 o rs 数 4 O 优 n i C mp e s等 。 p 关键 词 Huf n算 法 ;R NE ;数 据 压 缩 f ma I X
中图 分类 号 : 2 2. P 08 4
文 献 标 识 码 :B
利 用 Hu f n算 法 对 RI X 格 式 GP fma NE S观 测 文 件 进 行 压 缩
徐 晓 华 熊 剑 罗 佳
( 汉 大 学 测 绘 学 院 ,武 i. 珞 喻 路 1 9号 ,4 0 7 ) 武 x市 2 3 0 9
RI X 格 式 文 件 是 GP NE S通 用 数 据 交 换 格 式 文 件 , 含 包
观 测 数 据 文 件 、 历 文 件 、 象 数 据 文 件 等 。 储 观 测 数 据 是 星 气 存 在 野 外 作 业 中 的 问 题 对 数 据 文 件 进 行 无 损 压 缩 , 高 有 效 提 储 存 空 间 是 解 决 的 办 法 之 一 。 NEX 格 式 采 用 AS I 码 , RI CI 存
点 又形 成 新 的节 点 , 后 直 到所 有 节 点 形 成 惟 一 一 个 节点 , 最
称 为根节 点 ;
程 序 的 实 现 由 Hu f n树 的 建 立 、 缩 部 分 、 出部 分 、 fma 压 输 主 程 序 和 解 压 缩 部 分 组 成 。在 用 Huf n 编 码 压 缩 的 时 候 , fma
关 键 是 如 何 根 据 被 压 缩 文 件 建 立 Hu f n树 。 先 定 义 一 个 f ma 首
数 据 结 构 , 包 括 ~ 符 号 的 使 用 频 率 、 节 点 名 和 两 个 子 节 它 父
3 )沿 着 根 向 着 树 叶 前 进 , 遇 到 一 个 节 点 如 果 向 左 边 每 就 记 为 0 向 右 边 则 记 1 最 后 将 所 有 0和 1串 起 来 , 得 到 , , 就
了这 个 树 叶 的 Hu f n编 码 。 fma
点 名 由 于 RI X 文 件 格 式 中 使 用 的 符 号 比 较 固 定 , 般 为 NE 一
英 文 大 小 写 、 字 字 符 和 几 个 常 用 符 号 , 本 上 没 有 超 过 数 基 1¨, 上 形 成 的 父 节 点 最 多 为 子 节 点 数 的 2倍 减 1 所 以 将 O 加 0 , 上 述 数 据 结 构 定 义 为 ( 0 × 2 1 个 , 整 个 Huf n树 则 10 — ) 而 f ma 由这种 结 构 串接 而成 。 建 立 Hu f n树 后 , 缩 部 分 则 按 照 编 好 的 父 节 点 、 f ma 压 左 右 子 节 点 , 位 分 配 0和 1 即 得 到 新 的 编 码 。首 先 按 照 树 的 按 , 结 构 从 树 根 出 发 , 着 节 点 的 标 注 向 树 叶 前 进 , 果 遇 到 向 沿 如 右则 产 生 一个 0 向左 则 产 生 1 最后 按 顺 序 将 这 些 产生 的 0 . , 和 1按 位 储 存 进 压 缩 文 件 。 压 缩 部 分 中 所 产 生 的 位 是 一 个 个 的 , 实 际 操 作 中 使 用 在
维普资讯
涮蛤 信 息与 工 程
J u n l fGe ma is 2 0 Oc ;2 5 o r a o tc 0 2 o t 7( )
2l
文 章 编 号 :1 0 — 8 7 2 0 ) 5 0 2 — 2 0 7 3 1 ( 0 2 0 — 0 10
了缓 冲 区 。 将 得 到 的 位 存 进 缓 冲 区 , 到 缓 冲 区 写 满 了 后 , 先 等 再一 次性 向硬盘 写入 。
下 面用 实 例说 明 该思 想 。例 如 一组 需 要 编码 的信 息 为 :
c b e c c dd 口 6 口 口 口 口 6 c 6 c口 口 c d a a de a 口 盘 6 6 口 6 口 口 口。 出 现 a、 、 、 b c
新 的 编 码 长 度 为 1 ×1 7 3 6 3 6 3 5 3 8 6 + × + × + × + × — 8


在 压 缩 余 地 , 其 自身 的 特 点 , 一 般 的 压 缩 软 件 很 难 达 到 但 用
理 想 效 果 , 为 进 行 RI X 格 式 的 文 件 压 缩 提 供 了舞 台 。 这 NE 1 Hu f a 压 缩 算 法 原 理 fm n Hu f n算 法 是 无 损 压 缩 算 法 , 以 用 于 对 GP 数 据 fma 可 S 文 件 的 压 缩 其 原 理 主 要 是 利 用 Huf n -y 树 , 造 方 法 fma - . 构 是从 树 叶到树 根生 成二 叉 树 , 步骤 如 下 : 其 1 )将 压 缩 的 符 号 按 其 频 率 进 行 排 列 ;
2 程 序 实现
口 6 c d e
图 2
最 终 的二 叉树
位 , 用 AS I 而 C I码 储 存 , 需 要 4 × 8 3 0 bt 可 见 采 用 则 O — 2 i。 Huf n编 码 , 得 了 数 据 压 缩 的 效 果 。 f ma 获
2 )依 次 将 出 现 频 率 最 低 的 符 号 结 合 形 成 新 符 号 , 个 这 新 的 符 号 可 以 称 为 节 点 , 后 节 点 和 节 点 或 和 另 外 未 结 合 的 然
相关文档
最新文档