当前位置:三九宝宝网 → 宝宝教育 → 教学论文 → 正文

如何用Java或C语言解析二进制文件为文本文件

更新:02-03 整理:39baobao.com
字体:

[C语言十进制数转化为二进制数]#include <stdio.h> void main() { int a; scanf(\"%d\",&a);//输入一个10进制数。 int result=0;//存储a的二进制结果。 int p=1;//p=1表示个位数 do { int b=a%2;//b是余数,第...+阅读

在学习C语言fopen()函数后,知道它的第二个参数是标志字符串。如果字符串中出现'b',则表明是以打开二进制(binary)文件,否则是打开文本文件。 那么什么是文本文件,什么是二进制文件呢? 从文件编码的方式来看,文件可分为ASCII码文件和二进制码文件两种。 ASCII文件也称为文本文件,这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码。

例如,数5678的存储形式为: ASC码: 00110101 00110110 00110111 00111000 ↓ ↓ ↓ ↓ 十进制码: 5 6 7 8 共占用4个字节。ASCII码文件可在屏幕上按字符显示, 例如源程序文件就是ASCII文件,用DOS命令TYPE可显示文件的内容。 由于是按字符显示,因此能读懂文件内容。 二进制文件是按二进制的编码方式来存放文件的。例如,数5678的存储形式为:00010110 00101110只占二个字节。

二进制文件虽然也可在屏幕上显示,但其内容无法读懂。C系统在处理这些文件时,并不区分类型,都看成是字符流,按字节进行处理。输入输出字符流的开始和结束只由程序控制而不受物理符号(如回车符)的控制。因此也把这种文件称作“流式文件”。 文本文件与二进制文件的区别在系统存储上它们实际上并没有什么区别,都是以二进制的方式存储于硬盘上。

之所以分二进制文件和文本文件,主要是逻辑上的区分,文本文件更人为可读而已。站在编程的角度看,文本文件是基于字符编码过后的,比如常见的就有ascii编码,gbk编码,unicode编码等,文本工具直接打开人为可读。而二进制文件是基于值的编码,这个值到底是什么,完全可自定义,所以可以说二进制文件是一种特殊编码的文件。如果用java编程,可能就根本没遇到过以二进制打开和文本文件打开这两种方式。

java里面有字符流和字节流,字符流是对字节流的封装,有编码解码,而字节流操作的则是byte数组,所以更容易理解。python的文件读写方式则更贴近C。因为python和java他们底层都是C,所以很有必要弄清C的读写文件方式。 在Windows和DOS系统中,狭义的文本文件是指扩展名为txt的文件。实际上,那些没有规定格式的,由可理解的的ASCII以及其他编码文字组成的文件都是文本文件,如C源程序文件,HTML超文本,XML。

除此之外的其他文件都是二进制文件,如Word文件DOC,图象格式文件JPG。 实际上,fopen()的 b 标志不但可以打开二进制文件,还可以打开文本文件,同样,不带 b 标志也可以打开文本文件。 既然这样,为什么还要区分两种打开方式呢? 因为这两种方式在读写文件时的操作是不一样的。 二进制方式很简单,读文件时,会原封不动的读出文件的全部内容,写的时候,也是把内存缓冲区的内容原封不动的写到文件中。

而文本方式就不一样了,在写文件时,会将换行符号CRLF(0x0D 0x0A)全部转换成单个的0x0A,并且当遇到结束符CTRLZ(0x1A)时,就认为文件已经结束。相应的,写文件时,会将所有的0x0A换成0x0D0x0A。 所以,若使用文本方式打开二进制文件时,就很容易出现文件读不完整,或内容不对的错误。即使是用文本方式打开文本文件,也要谨慎使用,比如复制文件,就不应该使用文本方式。

要特别注意的是,上面这样的说法仅适用于DOS和Windows系统。在Unix和其他一些系统中,没有文本方式和二进制方式的区分,使不使用'b'标志都是一样的。这是由于不同操作系统对文本文件换行符的定义,和C语言中换行符的定义有所不同而造成的。 如上文已提到,DOS和Windows系统使用CRLF(0x0D 0x0A)即\r\n双字节作为文本文件换行符,而Unix文本文件的换行符只有一个字节LF(0x0A)为。

在C语言中,也是以LF即'\n'为换行符。 由于DOS/Windows定义的换行符和C语言的不一致,C语言的标准输入输出函数适行读写文本文件时,就适行了CRLF->LF的转换。而Unix的定义和C语言的是一样的,就不必转换了。 那么,为什么会有定义不一致的情况呢,这纯属历史原因。当初C是在Unix上发展的,对换行的定义自然就一样了。其后C被引入到DOS系统,为了使原有的C程序能不加修改的读写DOS的文本文件,所以就在文件读写上做了修改。

随着DOS/Windows成为主流平台,这个当初为了兼容而做的修改给众多的C语言开发者添了这样一个小小的麻烦。 所以,二进制和文本模式的区别就在于对于换行符和一些非可见字符上面的转化,所以安全起见,是使用二进制读取会比较安全一些。

本文地址:https://www.39baobao.com/show/29_35563.html

以上内容来自互联网,请自行判断内容的正确性。若本站收录的信息无意侵犯了贵司版权,请联系我们,我们会及时处理和回复,谢谢.

以下为关联文档:

如何用c语言将十进制数转换为二进制//--------------------------------------------------------------------------- #include <stdio.h> long int btd(char *s) /*将以字符串形式存储在s地址中的二进制数字...

c语言如何用循环将十进制转为二进制#include"stdio.h" int er(int m); int ba(int f); int shiliu(int k); int n,a[30],c=0; void main() { int i,j; printf("*****欢迎使用这个程序,请选择序号*****\n"); scanf("%d",...

写十进制转化为二进制 c语言#include void main() { int x,i,j,b,a[10]; do{ scanf("%d",&x); }while(x1000); switch(x){ case 1: printf("1\n");break; case 2: printf("10\n");break; default: for(i=0;i{...

如何用c语言编写将十进制的数转换成二进制数的程序简单办法是用联合体,直接打印出来。 typedef union DANDB { unsigned long int i; // 存放十进制数 unsigned char c[4]; // 按字元(bit) 直接打印它出来 } DandB; int main() {...

C语言十进制转二进制二进制转十进制举例 十进制123.转换成二进制123/2=61余数...1 ***********************61/2=30余数...1 ***********************30/2=15.......0 ***********************15/2=7........1...

Linux C语言在文件中查找字符串匹配关键字#include #include #include #define FILE_NAME_MAX 50 #define SEPERATE_STRING_MAX 100 int StrCount(FILE *file,char *str); int main() { char *filename,*spestr; FIL...

用易语言编写文件加密程序谢谢先下载精易模块。 然后再在“_启动窗口_创建完毕”里加上这几句命令: .版本 2 文件_关联 (, “要关联的后缀名”, , “文件”, ) 取命令行 (启动命令行) .如果真 (取数组成员数 (启动命...

易语言写dll文件必须注意好像没有必须要写那几句代码.. 不过有两个子程序是不可以删除或修改的.. 只有公开的属性需不需要.. 如果公开选中了..就可以在DLL里调用..(在源码开发里可以调用..在其它的...

用C语言读取一个文件中的内容如何对不同的行进行解析比如是配很简单的 配置文件 微软有抓们的一套解析函数 INI文件是Windows系统中一类比较重要的文件,通常用来存放系统或者应用程序的配置信息,以方便系统或者应用 程序在初始化时再次读...