精华内容
下载资源
问答
  • python处理二进制文件(.bin)

    万次阅读 多人点赞 2019-02-11 16:30:33
    扩展名为.bin的文件就是一个二进制文件,可以直接用一个叫winhex的软件打开 二进制文件读写 bytes类型转化 这里写自定义目录标题什么是二进制文件二进制文件读写bytes类型转化欢迎使用Markdown编辑器新的改变功能...

    最近遇到了python处理.bin文件的一些问题,简单地罗列一下。

    • 1. 什么是.bin文件

    • 2. 二进制文件读写

      • 2.1 读二进制文件

      • 2.2 写二进制文件

      • 2.3 打开文件模式

    1. 什么是.bin文件

    扩展名为.bin的文件就是一个二进制文件(binary)。不同于文本文件,二进制文件用记事本、Notepad++等打开都是乱码。
    像是这样:
    用记事本打开了一个.bin文件
    但是.bin文件可以用WINHEX等软件打开。二进制文件里面存储的都是数据,只有按照某个预先设定的规则读出,才能明白这些数字的具体含义。

    WINHEX将二进制文件内容转为十六进制的形式展现出来:
    用WINHEX打开了一个.bin文件
    二进制文件相比于文本文件的优点:节约存储空间、读写速度快、有一定的加密保护作用。

    关于二进制文件与文本文件,可以参考下这个博客程序员别唬我系列之:二进制文件

    2. 二进制文件读写

    2.1 读二进制文件

    读二进制文件 “x.bin” 的内容,每次输出一个字节。
    (1) 文件路径放在filepath中,这里将.bin文件与代码文件放在了同一个文件夹下,因此没有写绝对路径。

    (2) open(filepath, 'rb'):以读的形式打开文件文件,注意使用 rb 来读二进制文件。

    (3) 记得close: binfile.close()

    import struct
    import os
    if __name__ == '__main__':
        filepath='x.bin'
        binfile = open(filepath, 'rb') #打开二进制文件
        size = os.path.getsize(filepath) #获得文件大小
        for i in range(size):
            data = binfile.read(1) #每次输出一个字节
            print(data)
        binfile.close()
    

    运行,输出结果:
    结果

    如果想看到十进制的结果,可以使用python中的struct.unpack()方法:
    struct.unpack('B', data):这里的参数B的含义是将C结构数据的unsigned char 类型转为python中的integer
    这里得到的num是tuple类型,因此使用num[0]将数字取出。

    for i in range(size):
        data = binfile.read(1)
        num = struct.unpack('B', data)
        print(num[0])
    

    输出结果为:
    在这里插入图片描述

    2.2 写二进制文件

    (1) 假设要把数字123写入二进制文件,首先需要把数字int类型转为bytes类型。
    data.to_bytes(1, 'big'):参数 ‘1’ :转为1个字节的bytes; 参数 'big’ :byteorder。

    查看某个变量a的类型,可以利用type()

    a=123
    print('a:',type(a))
    b=a.to_bytes(1,'big')
    print('b:',type(b))
    

    输出:

    (2) open(filepath, 'ab+') :写模式打开二进制文件。
    写入时注意:使用 ab+ 来完成追加写入,使用 wb来完成覆盖写入。

    (3) 关闭binfile.close()

    data=123
    content= data.to_bytes(1, 'big')
    
    filepath='123.bin'
    binfile = open(filepath, 'ab+') #追加写入
    binfile.write(content)
    print('content',content)
    binfile.close()
    

    2.3 打开文件模式

    列了下打开文件的不同模式,也就是open()里第二个参数。 带b的参数表示操作二进制文件,不带b的操作文本文件。
    摘自Python文件读写(open(),close(),with open() as f…

    模式 描述
    r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
    rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
    r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
    rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
    w 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    w+ 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
    ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
    展开全文
  • 文本文件和二进制文件的判别

    千次阅读 2019-06-26 15:17:03
    作为程序员,从第一次接触编程开始,就知道了文件的两大类别:文本文件和二进制文件。但是,如何定义和判别这两类文件,在我的知识体系了,却一直是模糊的。直觉上,用文本方式读写的文件一定是文本文件,用二进制...

    作为程序员,从第一次接触编程开始,就知道了文件的两大类别:文本文件和二进制文件。但是,如何定义和判别这两类文件,在我的知识体系里,却一直是模糊的。直觉上,用文本方式读写的文件一定是文本文件,用二进制方式读写的文件一定是二进制文件,然而,用 notepad++ 照样可以打开甚至编辑一个 .jpg 文件或者一个 .xls 文件。

    事实上,不管是文本文件还是二进制文件,在物理存储上都是二进制的。二者之间的区别不是物理层面的,而是逻辑层面的。文本文件是基于字符编码的文件,常见的编码有 ASCII 编码,UTF 编码等等。二进制文件是基于值编码的文件,你可以根据具体应用,指定某个值是什么意思(可以看作是自定义编码)。

    在很多文档处理的应用中,我们需要判别某个文件是文本文件还是二进制文件。如果单从文件的扩展名来判别,自然是最简单的,但结果未必是正确的。我们重点讨论通过文件内容来判别。

    适用于 py2 的方法:

    import string
    
    def isText(content):
    	"""判断文件是文本还是二进制"""
    	
    	if "\0" in content:
    	    return False
    	
    	text_characters = ''.join(map(chr, range(32, 127)) + list("\n\r\t\b"))
    	_null_trans = string.maketrans("", "")
    	
    	t = content.translate(_null_trans, text_characters)
    	if float(len(t))/float(len(content)) > 0.30:
    	    return False
    	else:
    	    return True
    

    适用于 py3 的方法:

    def isText(content):
        """判断文件是文本还是二进制"""
        
        if b'\0' in content:
            return False
        
        text_characters = ''.join(list(map(chr, range(32, 127))) + list('\n\r\t\b'))
        _null_trans = b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff'
        
        t = content.translate(_null_trans, text_characters.encode())
        if float(len(t))/float(len(content)) > 0.30:
            return False
        else:
            return True
    
    展开全文
  • 文本文件和二进制文件的差异和区别

    万次阅读 多人点赞 2018-05-16 11:11:20
    广义上的二进制文件包括文本文件,这里讨论的是狭义上的二进制文件与文本文件的比较: 能存储的数据类型不同 文本文件只能存储char型字符变量。二进制文件可以存储char/int/short/long/float/……各种变量值。 每...

    广义上的二进制文件包括文本文件,这里讨论的是狭义上的二进制文件与文本文件的比较:

    1. 能存储的数据类型不同
      文本文件只能存储char型字符变量。二进制文件可以存储char/int/short/long/float/……各种变量值。
    2. 每条数据的长度
      文本文件每条数据通常是固定长度的。以ASCII为例,每条数据(每个字符)都是1个字节。进制文件每条数据不固定。如short占两个字节,int占四个字节,float占8个字节……
    3. 读取的软件不同
      文本文件编辑器就可以读写。比如记事本、NotePad++、Vim等。二进制文件需要特别的解码器。比如bmp文件需要图像查看器,rmvb需要播放器……
    4. 操作系统对换行符(‘\n’)的处理不同(不重要)
      文本文件,操作系统会对’\n’进行一些隐式变换,因此文本文件直接跨平台使用会出问题。
      在Windows下,写入’\n’时,操作系统会隐式的将’\n’转换为”\r\n”,再写入到文件中;读的时候,会把“\r\n”隐式转化为’\n’,再读到变量中。
      在Linux下,写入’\n’时,操作系统不做隐式变换。
      二进制文件,操作系统不会对’\n’进行隐式变换,很多二进制文件(如电影、图片等)可以跨平台使用。

    从存储方式来说,文件在磁盘上的存储方式都是二进制形式,所以,文本文件其实也应该算二进制文件。先从他们的区别来说,虽然都是二进制文件,但是二进制代表的意思不一样。打个比方,一个人,我们可以叫他的大名,可以叫他的小名,但其实都是代表这个人。二进制读写是将内存里面的数据直接读写入文本中,而文本呢,则是将数据先转换成了字符串,再写入到文本中。

    要弄明白二者的区别,需要知道文件的读写过程。以读文件为例,

    实际上是磁盘 》》 文件缓冲区》》应用程序内存空间这两个转化过程。我们说“文本文件和二进制文件没有区别”,实际上针对的是第一个过程;既然没有区别,那么打开方式不同,为何显示内容就不同呢?这个区别实际上是第二个过程造成的。

    文件实际上包括两部分,控制信息和内容信息。纯文本文件仅仅是没有控制格式信息罢了;

    实际上也是一种特殊的二进制文件。所以,我们很难区分二者的不同,因为他们的概念上不是完全互斥的。我们说文本文件是特殊的二进制文件,是因为文本文件实际上的解释格式已经确定了:ASCII或者unicode编码。文本文件的一个缺点是,它的熵往往较低,也就是说,其实本可以用更小的存储空间记录这些信息。比如,文本文件中的一个数字65536,需要用5个字节来存储;但是用二进制格式,采用int存储,仅仅需要2个字节。而二进制文件elf和bmp等,都往往有一个head,告诉你文件信息和解释方式。

    记事本支持文本文件而不支持二进制文件,所以如果你用记事本打开文本文件那么一切正常,如果打开的是二进制文件就会出现乱码。但也有不乱码的地方,你会注意到那些地方都是字符编码的,而对于int、double等类型所对应的值都是乱码的,这是由于记事本只能够识别字符类型,而无法识别其他类型。

    1、二进制文件是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放,也就是说存放的是数据的原形式。

    2、文本文件是把数据的终端形式的二进制数据输出到磁盘上存放,也就是说存放的是数据的终端形式。

    字符数据本身在内存中就经过了编码,所以无论是二进制还是文本形式都是一样的,而对于非字符数据来说,例如inti=10;如果用二进制来进行存储的话为1010,但是如果需要用文本形式来进行存储的话就必须进行格式化编码(对1和0分别编码,即形式为‘1’和‘0’分别对应的码值)。



    一、文本文件与二进制文件的定义

    大家都知道计算机的存储在物理上是二进制的,所以文本文件与二进制文件的区别并不是物理上的,而是逻辑上的。这两者只是在编码层次上有差异。简单来说,文本文件是基于字符编码的文件,常见的编码有ASCII编码,UNICODE编码等等。二进制文件是基于值编码的文件,你可以根据具体应用,指定某个值是什么意思(这样一个过程,可以看作是自定义编码。

    从上面可以看出文本文件基本上是定长编码的(也有非定长的编码如UTF-8)。而二进制文件可看成是变长编码的,因为是值编码嘛,多少个比特代表一个值,完全由你决定。大家可能对BMP文件比较熟悉,就拿它举例子吧,其头部是较为固定长度的文件头信息,前2字节用来记录文件为BMP格式,接下来的8个字节用来记录文件长度,再接下来的4字节用来记录bmp文件头的长度。

    二、文本文件与二进制文件的存取

    文本工具打开一个文件的过程是怎样的呢?拿记事本来说,它首先读取文件物理上所对应的二进制比特流,然后按照你所选择的解码方式来解释这个流,然后将解释结果显示出来。一般来说,你选取的解码方式会是ASCII码形式(ASCII码的一个字符是8个比特),接下来,它8个比特8个比特地来解释这个文件流。例如对于这么一个文件流”01000000_01000001_01000010_01000011”(下划线”_”,为了增强可读性手动添加的),第一个8比特”01000000”按ASCII码来解码的话,所对应的字符是字符”A”,同理其它3个8比特可分别解码为”BCD”,即这个文件流可解释成“ABCD”,然后记事本就将这个“ABCD”显示在屏幕上。

    事实上,世界上任何东西要与其他东西通信会话,都存在一个既定的协议,既定的编码。人与人之间通过文字联络,汉字“妈”代表生你的那个人,这就是一种既定的编码。但注意到这样一种情况,汉字“妈”在日本文字里有可能是你生下的那个人,所以当一个中国人A与日本B之间用“妈”这个字进行交流,出现误解就很正常的。用记事本打开二进制文件与上面的情况类似。记事本无论打开什么文件都按既定的字符编码工作(如ASCII码),所以当他打开二进制文件时,出现乱码也是很必然的一件事情了,解码和译码不对应嘛。例如文件流”00000000_00000000_00000000_00000001”可能在二进制文件中对应的是一个四字节的整数int 1,在记事本里解释就变成了”NULL_NULL_NULL_SOH”这四个控制符。

    文本文件的存储与其读取基本上是个逆过程。而二进制文件的存取显然与文本文件的存取差不多,只是编/解码方式不同而已。

    三、文本文件与二进制文件的优缺点

    因为文本文件与二进制文件的区别仅仅是编码上不同,所以他们的优缺点就是编码的优缺点,这个找本编码的书来看看就比较清楚了。一般认为,文本文件编码基于字符定长,译码容易些;二进制文件编码是变长的,所以它灵活,存储利用率要高些,译码难一些(不同的二进制文件格式,有不同的译码方式)。关于空间利用率,想想看,二进制文件甚至可以用一个比特来代表一个意思(位操作),而文本文件任何一个意思至少是一个字符。

    在windows下,文本文件不一定是一ASCII来存贮的,因为ASCII码只能表示128的标识,你打开一个txt文档,然后另存为,有个选项是编码,可以选择存贮格式,一般来说UTF-8编码格式兼容性要好一些.而二进制用的计算机原始语言,不存贮兼容性. 很多书上还认为,文本文件的可读性要好些,存储要花费转换时间(读写要编译码),而二进制文件可读性差,存储不存在转换时间(读写不要编解码,直接写值).这里的可读性是从软件使用者角度来说的,因为我们用通用的记事本工具就几乎可以浏览所有文本文件,所以说文本文件可读性好;而读写一个具体的二进制文件需要一个具体的文件解码器,所以说二进制文件可读性差,比如读BMP文件,必须用读图软件。

    而这里的存储转换时间应该是从编程的角度来说的,因为有些操作系统如windows需要对回车换行符进行转换(将”\n”,换成”\r\n”,所以文件读写时,操作系统需要一个一个字符的检查当前字符是不是”\n”或”\r\n”).这个在存储转换在Linux操作系统中并不需要,当然,当在两个不同的操作系统上共享文件时,这种存储转换又可能出来。



    文本文件是一种计算机文件,它是一种典型的顺序文件,其文件的逻辑结构又属于流式文件。

    特别的是,文本文件是指以ASCII码方式(也称文本方式)存储的文件,更确切地说,英文、数字等字符存储的是ASCII码,而汉字存储的是机内码。文本文件中除了存储文件有效字符信息(包括能用ASCII码字符表示的回车、换行等信息)外,不能存储其他任何信息。

    文本文件是一种由若干行字符构成的计算机文件。文本文件存在于计算机文件系统中。通常,通过在文本文件最后一行后放置文件结束标志来指明文件的结束。文本文件是指一种容器,而纯文本是指一种内容。文本文件可以包含纯文本。一般来说,计算机文件可以分为两类:文本文件和二进制文件。

    只含有ASCII字符的文本文件可以在Unix、Macintosh、Microsoft Windows、DOS和其它操作系统之间自由交互,而其它格式的文件是很难做到这一点的。但是,在这些操作系统中,换行符并不相同,处理非ASCII字符的方式也不一致。

    .txt是包含极少格式信息的文字文件的扩展名。.txt格式并没有明确的定义,它通常是指那些能够被系统终端或者简单的文本编辑器接受的格式。任何能读取文字的程序都能读取带有.txt扩展名的文件,因此,通常认为这种文件是通用的、跨平台的。

    在英文文本文件中,ASCII字符集是最为常见的格式,而且在许多场合,它也是默认的格式。对于带重音符号的和其它的非ASCII字符,必须选择一种字符编码。在很多系统中,字符编码是由计算机的区域设置决定的。常见的字符编码包括支持许多欧洲语言的ISO 8859-1。

    由于许多编码只能表达有限的字符,通常它们只能用于表达几种语言。Unicode制定了一种试图能够表达所有已知语言的标准,Unicode字符集非常大,它囊括了大多数已知的字符集。Unicode有多种字符编码,其中最常见的是UTF-8,这种编码能够向后兼容ASCII,相同内容的的ASCII文本文件和UTF-8文本文件完全一致。

    微软的MS-DOS和Windows采用了相同的文本文件格式,它们都使用CR和LF两个字符作为换行符,这两个字符对应的ASCII码分别为13和10。通常,最后一行文本并不以换行符(CR-LF标志)结尾,包括记事本在内的很多文本编辑器也不在文件的最后添加换行符。

    大多数Windows文本文件使用ANSI、OEM或者Unicode编码。Windows所指的ANSI编码通常是1字节的ISO-8859编码,不过对于像中文、日文、朝鲜文这样的环境,需要使用2字节字符集。在过渡至Unicode前,Windows一直用ANSI作为系统默认的编码。而OEM编码,也是通常所说的MS-DOS代码页,是IBM为早期IBM个人电脑的文本模式显示系统定义的。在全屏的MS-DOS程序中同时使用了图形的和按行绘制的字符。新版本的Windows可以使用UTF-16LE和UTF-8之类的Unicode编码。

    由于结构简单,文本文件被广泛用于记录信息。它能够避免其它文件格式遇到的一些问题。此外,当文本文件中的部分信息出现错误时,往往能够比较容易的从错误中恢复出来,并继续处理其余的内容。文本文件的一个缺点是,它的熵往往较低,也就是说,可以用较小的存储空间记录这些信息。

    文本文件基本上是定长编码的(也有非定长的编码如UTF-8),基于字符,每个字符在具体编码中是固定的,ASCII码是8个比特的编码,UNICODE一般占16个比特。而二进制文件可看成是变长编码的,因为是值编码,多少个比特代表一个值,完全由自己决定。

    广义的二进制文件即指文件,由文件在外部设备的存放形式为二进制而得名。狭义的二进制文件即除文本文件以外的文件。

    每个字符由一个或多个字节组成,每个字节都是用的-128—127之间的部分数值来表示的,也就是说,-128——127之间还有一些数据没有对应任何字符的任何字节。如果一个文件中的每个字节的内容都是可以表示成字符的数据,我们就可以称这个文件为文本文件。文本文件只是二进制文件中的一种特例,为了与文本文件相区别,人们又把除了文本文件以外的文件称为二进制文件,由于很难严格区分文本文件和二进制文件的概念,所以我们可以简单地认为,如果一个文件专门用于存储文本字符的数据,没有包含字符以外的其他数据,我们就称之为文本文件,除此之外的文件就是二进制文件。

    为什么要使用二进制文件。原因大概有三个:

    第一是二进制文件比较节约空间,这两者储存字符型数据时并没有差别。但是在储存数字,特别是实型数字时,二进制更节省空间;第二个原因是,内存中参加计算的数据都是用二进制无格式储存起来的,因此,使用二进制储存到文件就更快捷。如果储存为文本文件,则需要一个转换的过程。在数据量很大的时候,两者就会有明显的速度差别了。第三,就是一些比较精确的数据,使用二进制储存不会造成有效位的丢失。



    转自:

    1. 文本文件和二进制文件的差异和区别
    2. 文本文件与二进制文件区别
    展开全文
  • 通常,我们喜欢把文件分为二进制文件(binary file)和文本文件(text file)两类。但事实上,所有文件在计算机上都是以二进制方式进行存储的,因此二者并无本质上的区别,它们的区别仅在于对文件内容的解释方式上。

      通常,我们喜欢把文件分为二进制文件(binary file)和文本文件(text file)两类。但事实上,所有文件在计算机上都是以二进制方式进行存储的,因此二者并无本质上的区别,它们的区别仅在于对文件内容的解释方式上。


    1.概述

      广义上来说,二进制文件即指文件,由文件在外部设备的存放形式为二进制而得名,显然,这个层面下,文本文件属于二进制文件的一种;那么,本文所要讲的,是狭义上的二进制文件和文本文件。
      如前所述,所有的文件都是由一连串的0、1组成,故而在物理上,二进制文件和文本文件无差异,它们的差异是逻辑上的。当我们打开文件时,需要对底层的二进制码作出相应的解释:对于文本文件,应用程序(一般为文本编辑器)会将二进制码解释为文本字符;而对于二进制文件,应用程序(很多,如图像查看器、视频播放器等)会将二进制码解释为其它内容。对于二进制文件和文本文件的区分,以上表述似乎还不能很让人满意,下面我们采用Q&A的形式,细致地剖析这个问题:

    • — Q:简单直接地,什么是文本文件,什么又是二进制文件?
    • — A:文本文件,就是根据字符编码规则解码后,能够全部解码为文本字符的;二进制文件,就是除了文本文件外的所有其它文件,也即,文件底层的二进制码不能根据字符编码规则全部解码为文本字符;换言之,文本文件是根据字符编码规则写入的,而二进制文件是根据其它规则编码写入的;
    • — Q:拿到一个文件,应用程序怎么知道根据什么规则去解码?
    • — A:不同类型的文件有不同的解码规则,因而就有不同的解码器,只要我们选对了解码器(应用程序),解码器自然会根据一套固定的规则去对文件进行解码,文本文件如此,二进制文件(如bmp、rmvb、png)亦如此;
    • — Q:如何选择正确的解码器?
    • — A:最简单的,根据文件扩展名去选择解码器即可,比如,对于.txt文件,这是文本文件,选用记事本或者notepad++均可,对于.bmp文件,这是图像文件(或者说是二进制文件),选用图像查看器即可;不过,文件扩展名是可以随意更改的,因此一个更可靠的方法是根据文件头去选择解码器:一般而言,文件都有文件头,处在文件的开头部分,其中包含着文件的格式信息,比如有个文件的开头两个字节是 0x42 0x4D,对应的ASCII字符是BM,因此我们知道这是一个BMP文件,故而选择图像查看器即可;
    • — Q:如果选错了解码器,文件能打开吗?
    • — A:选错了解码器,由于编解码规则不一致,解释出来的内容自然就成了所谓的“乱码”,比如,用记事本去打开.bmp文件,就会看到一堆乱码,当然也有不是乱码的地方,你会注意到那些地方都显示为字符,因此能被记事本用字符解码规则解释出来;

      相信上述几个问题已经解决了绝大多数人的疑惑,接下来我们分别从文件读写的角度切入,进一步区分二进制文件和文本文件。

    2.写(write)

    1. 能存储的数据类型不同
      • 文本文件只能存储char型字符变量;
      • 二进制文件可以存储char/int/short/long/float/……各种变量值;
    2. 每条数据的长度不同
      • 文本文件每条数据通常是固定长度的,以ASCII字符为例,每条数据(每个字符)都是1个字节(也有非定长的编码如UTF-8);
      • 二进制文件每条数据不固定,如short占两个字节,int占四个字节,float占8个字节;
    3. 对换行符的处理不同(详见文本文件换行符
      • 文本文件的换行符,在不同的操作系统中有所区别:对于DOS\Windows操作系统,当我们向文本文件中写入换行符“\n”时,会自动转换为“\r\n”再写入,当我们从文本文件中读取时,又会自动将“\r\n”再转换为“\n”输出;对于Unix\类Unix操作系统,写入读取均为“\n”,没有转换过程;
      • 二进制文件的换行符,不存在上述问题,写入的是什么就是什么;

    3.读(read)

    1. 读取的应用程序不同
      • 文本文件,选用文本编辑器,如记事本、notepad++、vim等;
      • 二进制文件,需要特别的解码器,如bmp文件需要图像查看器,rmvb文件需要视频播放器;

    4.二者的比较

    1. 文本文件的优点
      • 一般认为,文本文件编码基于字符定长,译码容易;二进制文件编码是变长的,所以它灵活,存储利用率要高些,译码难一些(不同的二进制文件格式,有不同的译码方式);
      • 由于结构简单,文本文件被广泛用于记录信息。它能够避免其它文件格式遇到的一些问题。此外,当文本文件中的部分信息出现错误时,往往能够比较容易的从错误中恢复出来,并继续处理其余的内容。
    2. 二进制文件的优点
      • 二进制文件比较节约空间,这两者储存字符型数据时并没有差别。但是在储存数字,特别是实型数字时,二进制更节省空间。比如储存数据:3.1415927,文本文件需要 9 个字节,分别储存:3 . 1 4 1 5 9 2 7 这 9 个 ASCII 值,而二进制文件只需要 4 个字节(DB 0F 49 40);
      • 内存中参加计算的数据都是用二进制无格式储存起来的,因此,使用二进制储存到文件就更快捷。如果储存为文本文件,则需要一个转换的过程。在数据量很大的时候,两者就会有明显的速度差别了。(就像上面的3.1415927需要转换一番);
      • 一些比较精确的数据,使用二进制储存不会造成有效位的丢失。

    参考文献

    [1] https://www.zhihu.com/question/19971994
    [2] https://zhuanlan.zhihu.com/p/20693043
    [3] http://blog.csdn.net/sxhelijian/article/details/29594687
    [4] http://www.cnblogs.com/zhourong2015/p/5094688.html
    [5] https://baike.baidu.com/item/BMP/35116?fr=aladdin
    [6] http://www.cnblogs.com/flying-roc/articles/1798817.html
    [7] http://blog.csdn.net/jason_cuijiahui/article/details/73866060
    [8] http://www.cnblogs.com/macliu/p/6340131.html
    [9] http://www.cjjjs.com/paper/xmkf/624201593922582.aspx
    [10] https://www.dplord.com/2016/03/14/diffenerce-between-binary-file-and-text-file/
    [11] http://www.cnblogs.com/gala/archive/2011/09/22/2184801.html
    [12] http://blog.csdn.net/universe_hao/article/details/52779699
    [13] http://blog.csdn.net/abcdyzhang/article/details/56331492
    以上为本文的全部参考文献,对原作者表示感谢。

    展开全文
  • 二进制文件和 ASCII

    千次阅读 2019-03-20 09:59:44
    二进制文件: 包含在ASCII及扩展 ASCII字符中编写的数据或程序指令的文件。计算机文件基本上分为二种:二进制文件和 ASCII(也称纯文本文件),图形文件及文字处理程序等计算机程序都属于二进制文件。这些文件含有...
  • 关于二进制文件读写。
  • 如果有些文件,比如是媒体文件,因格式太多...这些头部编码可以用UltraEdit或是winhex来能过二进制方式打开文件来查看 1、从Ultraedit查看的头部编码 JPEG (jpg),文件头:FFD8FF PNG (png),文件头:89504E47
  • 将某二进制文件放在Resources目录下,希望用...查阅Unity文档得知,使用Resources.Load读二进制文件,则文件扩展名必须为bytes 另外注意,Resources.Load的路径不要包含扩展名 Please notice that files with the.txt...
  • 一:二进制文件 概念:如果一个文件的后缀是 .npy / .npz 则为一个二进制文件 二进制文件生成 np.save(“file_name”,array) 注:save默认保存的为.npy文件,file_name可不加后缀,且只能保存一个数组 arr1 = np....
  • 什么是二进制文件

    2019-12-28 22:10:42
    包含在ASCII及扩展 ASCII字符中编写的数据或程序...计算机文件基本上分为二种:二进制文件和 ASCII(也称纯文本文件),图形文件及文字处理程序等计算机程序都属于二进制文件。这些文件含有特殊的格式及计算机代码...
  • 暮鼓集 行走集 ...那么甚么是文本文件,甚么是二进制文件呢? 可能大多数人都没有仔细考虑过。 在Windows和DOS系统中,狭义的文本文件是指扩展名为txt的文件。实际上,那些没有规定格式的,由...
  • spine导出二进制文件怎么导入unity

    万次阅读 2017-05-19 16:51:33
    spine动画导出的二进制文件(.skel)怎么导入unity。
  • 什么是文本文件,什么是二进制文件?  在Windows和DOS系统中,狭义的文本文件是指扩展名为txt的文件。  实际上,那些没有格式的,由可理解的ASCII以及其他编码文字组成的文件都是文本文件,  如C源文件,...
  • ASCII文件与二进制文件

    千次阅读 2009-02-28 22:33:00
    计算机中的文件可以分为两类:ASCII文件和二进制文件。ASCII文件又称文本文件,其定义是包含ASCII字符的文件,通常由类似NotePad的文本编辑器创建。类似的,二进制文件的定义是内容为二进制信息的文件,通常由某些如...
  • 5.2.16 识别二进制文件

    2012-05-26 22:10:56
    5.2.15 删除文件 请使用r m命令的“rm file”格式删除文件。这个命令接受c p和mv 命令使用的同样的通配 ...L i n u x操作系统中的二进制文件通常在他们的文件名上都没有扩展名。输入命令“ p i c
  • 在使用 fread 读二进制文件(png 图片)的时候, 发现读取到内存中的数据和 二进制文件中的数据不一致, 同样, 在 使用 fwrite 写二进制文件(png 图片)的时候, 发现写入到内存中的数据和 二进制文件中的数据和...
  • spring mvc 二进制文件上传

    千次阅读 2019-04-02 14:19:43
    * 二进制文件上传(前端) * * @param multipartFile MultipartFile上传文件的二进制流 * @return fileUploadMap * @see org.springframework.web.multipart.MultipartFile */ public Map<Str...
  • 编程修改BIN等二进制文件

    千次阅读 2009-12-02 23:39:00
    在此之前,我曾经写过,把铃声,图片...我们获得的手机或者其他嵌入式设备的软件,常常都是一些扩展名为BIN的文件,这些文件就是二进制文件.对这类二进制文件的写操作需要慎之又慎,一着出错,就可能导致BIN文件再也无法使用.
  • 文本文件是一种计算机文件,它是一种典型的顺序文件,其文件的逻辑结构又属于流式文件。 特别的是,文本文件是指以ASCII码方式(也称文本方式)存储的文件,更确切地说,英文、数字等字符存储的是ASCII码,而汉字存储...
  • 二进制文件格式设计

    千次阅读 2017-08-09 22:31:06
    比如一个矢量绘图程序,需要将用户绘制的每个图元都保存到文件中,以后再次打开。应该优先考虑文本格式,文本格式容易测试和编辑。更应该优先考虑通用的文本格式,比如 XML, JSON, Lua 等等。这些通用的文本格式已经...
  • fopen 文本文件与二进制文件区别

    千次阅读 2017-01-05 14:01:54
    在学习C语言文件操作后,我们都会知道打开文件的函数是fopen,也知道它的第二个参数是 标志字符串。其中,如果字符串中出现'b',则表明是以打开二进制... 那么什么是文本文件,什么是二进制文件呢? 可能大多数人
  • Linux下的二进制文件比较工具

    千次阅读 2018-11-14 13:58:23
    Linux下的二进制文件比较工具
  •  一般来说,计算机文件可以分为两类:文本文件和二进制文件:  文本文件是一种由若干行字符构成的计算机文件。文本文件存在于计算机文件系统中。通常,通过在文本文件最后一行后放置文件结束标志来指明...
  • 一种C#读写二进制文件的通用方法

    万次阅读 2017-10-23 18:10:58
    在日常的工作中,我们经常需要进行一些二进制文件或协议的读写操作,用C#解析二进制文件常常是一件比较麻烦且容易出错的工作,本文介绍了一种在C#中实现快速读写二进制文件通用的方法。 以一个解析Mp

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 228,299
精华内容 91,319
关键字:

二进制文件扩展名