社区
数据结构与算法
帖子详情
知道后缀为.rif的是什么文件格式吗?如何生成呢?
collop
2002-12-23 03:04:42
谢谢!
...全文
2792
1
打赏
收藏
知道后缀为.rif的是什么文件格式吗?如何生成呢?
谢谢!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
1 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
laughcry2002
2002-12-25
打赏
举报
回复
rtf文件结构分析及其应用
邱立铭 王键
rtf是一种非常流行的文件结构,很多文字编辑器都支持它,vb等开发工具甚至还提供了richtxtbox的控件。编写通用工具的程序员应该考虑在自己的软件中加入读写rtf文件的功能,这样就需要对rtf的结构有充分的了解。而现在最重要的信息发布手段莫过于www了,在编辑软件中提供rtf到html的转换也是程序员应该考虑的事情。尽管word中已经有这个功能,但不能因此就对您的顾客说:“先用我的程序存成rtf,然后再用word......”。
下面将对rtf文件结构分析及其应用进行讨论。
一、rtf文件结构分析
rtf的结构并不复杂,但内容繁多,本文不可能一一说明,只能从总体上讨论一下(如果想阅读详尽的rtf文档,则可在internet上寻找或与笔者联系。)每个rtf文件都是一个文本文件,显示时由rtf阅读器格式化。文件开始处是{\rtf,它作为rtf文件的标志是必不可少的,rtf阅读器根据它来判断一个文件是否为rtf格式。然后是文件头和正文,文件头包括字体表、文件表、颜色表等几个数据结构,正文中的字体、表格的风格就是根据文件头的信息来格式化的。每个表用一对大括号括起来,当中包含了很多用字符“\”开始的命令。例如,某个颜色表如下:
{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}
开始时用\colortbl标明大括号内是颜色表,接着是\red0\green0\blue0,登记了一种颜色,这种颜色的红绿蓝分量都为0。其它表依此类推。文件头之后是正文,正文由版面格式化命令、文字和各种特殊命令组成。其中只有特殊命令用大括号括起来,而版面格式化命令和文字是“开放式”的,从而把文字和命令分离。文件结束时有一个“}”,和第一个“{”对应。在整个文件中,“}”和“{”必须一一对应。这种格式是rtf阅读器和转换器算法的基础。
rtf格式还有一个特别之处,就是有些字符在命令中有特殊的含义,所以当它们作为文本出现时需要在它们的前面加一个“\”,例如“\”本身就要表示为“\\”。事实上,这种形式在大多数编程语言中是很常见的。
二、算法分析
本节介绍的算法虽然是针对rtf的读写,但也是一般文件过滤器通用的方法,适用于各种格式文件之间的转换。具体来说就是把各种文件都转换成一种中间格式,再根据要求进行显示或转换。其中有个原则是一定要遵守的:程序必须能过滤掉不认识的格式。各种文件都有其特殊的格式,在转换过程中不可避免会出现格式损失的现象,在算法中要考虑这种情况。对于rtf这类格式化文本文件来说,最重要的是要正确地显示或转换文件的大小、颜色、字体等风格。因此,在程序中应该用一个数据结构把这些信息存起来,这个结构就是所谓的中间格式,怎样规定悉听尊便。以下是其流程图:
三、难点分析
在开发过程中我们遇到了不少问题,其中有两个问题特别有意思。
第一个问题是中文的表示方式。在rtf中中文用命令的形式表示:“\'内码”。内码就是汉字机内码。不过,请注意:rtf是文本文件,内码是用ascii码来储存的,必须把它转换成数字才能使用。例如,“电子与电脑”在rtf中的形式是:
\'b5\'e7\'d7\'d3\'d3\'eb\'b5\'e7\'c4\'d4
第二个是图片的问题,这也是本文的重点。rtf中图片以两种方式存在:第一种方式是直接嵌入,以{\pict开始;第二种方式是作为ole对象嵌入,这时以{\object开始。当rtf处理器能直接使用ole时,rtf文件中提供了ole的数据;否则,文件中直接提供图片的数据,以{\result开始。在使用中最常见的图片格式是内含dib bitmap的元文件(metafile),这种格式在sdk中没有说明,而且在rtf中是以压缩形式储存的,所以在转换时有一定困难。我们采取了一种比较新的方法:先把meta file的数据读出来存成一个文件,然后用getmetafile和playmetafile函数把文件中的图形打印在一个内存dc上,最后用抓图的方法把它存成bitmap文件。以下是具体程序:
void wmftobmp(int width,int height,char *metafile)
{
//width为图片宽度,height为图片高度,*metafile为元文件名
static hmetafile hmf;
char num[4];
file *fh;
hdc hmemdc;
hbitmap hbmp,hold;
bitmapfileheader hdr;
lpbitmapinfoheader lpbmpih;
hglobal hg;
bitmapcount++;
if(bitmapcount==3)
{
width=128;
height=132;
}
if(bitmapcount==1)
{
width=80;
height=50;
}
tostring10(bitmapcount,num);
//把字符串转换成数字的函数
lstrcpy(bmpfile,filepath);
lstrcat(bmpfile,num);
lstrcpy(giffile,bmpfile);
lstrcat(bmpfile,".bmp");
lstrcat(giffile,".gif");
hmf=getmetafile(metafile);
hdisplaydc=createdc("display",null,null,null);
hmemdc=createcompatibledc(hdisplaydc);
hg=globalalloc(ghnd,sizeof(bitmapinfoheader));
lpbmpih=(lpbitmapinfoheader)globallock(hg);
lpbmpih->bisize=sizeof(bitmapinfoheader);
lpbmpih->biwidth=width;
lpbmpih->biheight=height;
lpbmpih->biplanes=1;
lpbmpih->bibitcount=8;
lpbmpih->bicompression=0;
hbmp=createcompatiblebitmap(hdisplaydc,width,height);
globalunlock(hg);
globalfree(hg);
hold=selectobject(hmemdc,hbmp);
setmapmode(hmemdc,mm_anisotropic);
setwindoworgex(hmemdc,0,0,null);
setviewportextex(hmemdc,width,height,null);
playmetafile(hmemdc,hmf);
hbmp=selectobject(hmemdc,hold);
if((fh=fopen(bmpfile,"w+b"))==null)
{
return;
}
hdr.bftype=0x4d42;
hdr.bfsize=sizeof(bitmapfileheader)+sizeof(bitmapinfoheader)+256*sizeof(rgbquad)+width*height;
hdr.bfreserved1=0;
hdr.bfreserved2=0;
hdr.bfoffbits=sizeof(bitmapfileheader)+sizeof(bitmapinfoheader)+256*sizeof(rgbquad);
fwrite((lpstr)&hdr,sizeof(bitmapfileheader),1,fh);
hg=globalalloc(ghnd,sizeof(bitmapinfoheader)+256*sizeof(rgbquad));
lpbmpih=(lpbitmapinfoheader)globallock(hg);
lpbmpih->bisize=sizeof(bitmapinfoheader);
lpbmpih->biwidth=width;
lpbmpih->biheight=height;
lpbmpih->biplanes=1;
lpbmpih->bibitcount=8;
lpbmpih->bicompression=0;
lpbmpih->bisizeimage=width*height;
lpbmpih->biclrused=256;
lpbmpih->biclrimportant=0;
j=getdibits(hmemdc,hbmp,0,height,null,(bitmapinfo*)lpbmpih,dib_rgb_colors);
lpbmpih->bisize=sizeof(bitmapinfoheader);
fwrite(lpbmpih,sizeof(bitmapinfoheader)+256*sizeof(rgbquad),1,fh);
getdibits(hmemdc,hbmp,0,height,(lpstr)filebuffer,(bitmapinfo*)lpbmpih,dib_rgb_cols);
fwrite(filebuffer,width*height,1,fh);
globalunlock(hg);
globalfree(hg);
fclose(fh);
deletedc(hmemdc);
deletedc(hdisplaydc);
deleteobject(hbmp);
deleteobject(hold);
deletemetafile(hmf);
}//end function wmftobmp()
用这种方法还有一个好处,那就是当你从最底层开始开发rtf阅读器时,只需把playmetafile的参数从内存dc换成屏幕dc就可以显示图片了。
四.rtf格式的扩展
最后讨论一下rtf格式的扩展。rtf格式作为一个标准应该是统一的,但在某种情况下进行扩展是必要的。最明显的例子是微软的word,它有自己独有的rtf命令。如果想使自己的软件在技术上占有优势,也可以通过创造新的rtf命令来实现。例如,如果你希望在软件中支持dhtml,则可在rtf中嵌入{\dhtml或{\java之类的命令。由于rtf阅读器有过滤不认识命令的功能,所以这样做不会影响rtf文件的通用性。
(广州东风东路福今东39号201暨南大学电子工程系95级 邱立铭王键 510632)
Java 内核原理入门到实战(大神必经之路)
主要特性Java 语言是简单的:Java 语言的语法与 C 语言和 C++ 语言很接近,使得大多数程序员很容易学习和使用。另一方面,Java 丢弃了 C++ 中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。特别地,Java 语言不使用指针,而是引用。并提供了自动分配和回收内存空间,使得程序员不必为内存管理而担忧。Java 语言是面向对象的:Java 语言提供类、接口和继承等面向对象的特性,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为 implements)。Java 语言全面支持动态绑定,而 C++语言只对虚函数使用动态绑定。总之,Java语言是一个纯的面向对象程序设计语言。Java语言是分布式的:Java 语言支持 Internet 应用的开发,在基本的 Java 应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括 URL、URLConnection、Socket、ServerSocket 等。Java 的 RMI(远程方法激活)机制也是开发分布式应用的重要手段。Java 语言是健壮的:Java 的强类型机制、异常处理、垃圾的自动收集等是 Java 程序健壮性的重要保证。对指针的丢弃是 Java 的明智选择。Java 的安全检查机制使得 Java 更具健壮性。Java语言是安全的:Java通常被用在网络环境中,为此,Java 提供了一个安全机制以防恶意代码的攻击。除了Java 语言具有的许多安全特性以外,Java 对通过网络下载的类具有一个安全防范机制(类 ClassLoader),如分配不同的名字空间以防替代本地的同名类、字节代码检查,并提供安全管理机制(类 SecurityManager)让 Java 应用设置安全哨兵。Java 语言是体系结构中立的:Java 程序(
后缀
为 java 的文件)在 Java 平台上被编译为体系结构中立的字节码格式(
后缀
为 class 的文件),然后可以在实现这个 Java 平台的任何系统中运行。这种途径适合于异构的网络环境和软件的分发。Java 语言是可移植的:这种可移植性来源于体系结构中立性,另外,Java 还严格规定了各个基本数据类型的长度。Java 系统本身也具有很强的可移植性,Java 编译器是用 Java 实现的,Java 的运行环境是用 ANSI C 实现的。Java 语言是解释型的:如前所述,Java 程序在 Java 平台上被编译为字节码格式,然后可以在实现这个 Java 平台的任何系统中运行。在运行时,Java 平台中的 Java 解释器对这些字节码进行解释执行,执行过程中需要的类在联接阶段被载入到运行环境中。Java 是高性能的:与那些解释型的高级脚本语言相比,Java 的确是高性能的。事实上,Java 的运行速度随着 JIT(Just-In-Time)编译器技术的发展越来越接近于 C++。Java 语言是多线程的:在 Java 语言中,线程是一种特殊的对象,它必须由 Thread 类或其子(孙)类来创建。通常有两种方法来创建线程:其一,使用型构为 Thread(Runnable) 的构造子类将一个实现了 Runnable 接口的对象包装成一个线程,其二,从 Thread 类派生出子类并重写 run 方法,使用该子类创建的对象即为线程。值得注意的是 Thread 类已经实现了 Runnable 接口,因此,任何一个线程均有它的 run 方法,而 run 方法中包含了线程所要运行的代码。线程的活动由一组方法来控制。Java 语言支持多个线程的同时执行,并提供多线程之间的同步机制(关键字为 synchronized)。Java 语言是动态的:Java 语言的设计目标之一是适应于动态变化的环境。Java 程序需要的类能够动态地被载入到运行环境,也可以通过网络来载入所需要的类。这也有利于软件的升级。另外,Java 中的类有一个运行时刻的表示,能进行运行时刻的类型检查。
3月3 pytorch模型保存的.pt, .pth, .pkl的pytorch模型文件,只是
后缀
不同而已(仅此而已),打开方式
pytorch模型保存的格式。 首先讲讲保存模型或权重参数的
后缀
格式,权重参数和模型参数的...我们经常会看到
后缀
名为.pt, .pth, .pkl的pytorch模型文件,这几种模型文件在格式上有什么区别吗?其实它们并不是在格式上有
如果遇到 uni-app 下载文件
后缀
为.bin格式问题
uni-app 下载的文件
后缀
名 是 .bin 格式,如何处理
.mat格式文件是什么?及将png,jpg,bmp,gif,tiff,psd等格式图片转为.mat格式(附代码)
`.mat` 文件是 MATLAB 的数据存储的标准格式。这种文件是标准的二进制文件,也可以以 ASCII 码的形式保存和加载。`.mat` 文件的方便之处在于,它可以连同数据的变量名一同保存下来,并且不需要控制数据的存储格式,...
常见的文件名
后缀
及用法
Windows通过文件的
后缀
名来区分各种...*.pif为DOS环境下的可执行文件在Windows下执行时所需要的
文件格式
; *.crd即卡片文件(Card); *.rec即记录器宏文件(Record); *.txt文本文件; *.wri即文本文件(Write),
数据结构与算法
33,008
社区成员
35,326
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章