二进制文件是计算机文件中最常见的文件,它占用空间最小,适合于连续存储大量数据,同时它的存储格式基本和数据在内存中的存储格式一致或者类似,很多情况 下,甚至是内存的映射,因此无论是存储还是读取都是速度最快的,同时,具有非常高的安全性,如果不知道数据的格式,很难分析出文件的格式.
Picture
同文本文件一样,打开和关闭是完全相同的,不同的是写VI和读VI.

先看一个简单写的例子
Picture
上面写的是U8数组,我们知道,一个U8对应一个字节,1024个U8数组对应的文件长度应该是1024=1K,但是实际文件长度是 1028=4+1024,同理,下面的是I32的数组,一个I32=4BYTE,所以文件长度应该是1024*4=4096,但是实际文件长度是 4100=4+4*1024.

可以看出,对一维数组,多出四个字节的长度,实际上是多出一个U32=4BYTE,代表的是一维数组的长度.原因在于WRITE BIN FILE VI,有一个选择项,如下图,表示是否写入数组长度或者字符串长度.

Picture
如果取消写入数组或者字符串长度,则数组所占空间大小和二进制文件所占空间完全相同.
Picture
之所以读写二进制文件速度是最快的,根本原因在于二进制文件的存储方式和数据在内存中的存储方式相似或者完全一致.

WRITE BIN FILE VI还有一个重要的输入选择项目,BYTE ORDER(字节次序),很多编程语言或者操作系统称之为大小端的问题.

在所有的计算机系统,包括单片机中,都存在大小端的问题.简单地介绍一下.
我们知道,一个整数U16或者I16,有两个字节组成,比如整数0X1234,由字节0X12,和0X34组成,那么,在内存中或者文件中,到底是0X12在前还是0X34在前那,在不同的操作系统和不同的编程语言中,这是有区别的,这就造成的数据的大小端的问题.

对 于我们自己的数据二进制文件,这个选择并不重要,因为LV的读二进制VI也有同样的选择项,保持二者一致就可以了,但是如果被其它编程语言读取或者读取其 他语言写的二进制文件,就要考虑大小端的问题,否则数据表现可能会出现错误,比如0X1234,可能会变成0X3412.

上面的问题是一次写入整个数组,更常见的方式是磁盘流的方式,一次写入一个数据或者一个数据块

Picture
通过循环写入1K个字节,它的文件长度是1024,因为我们是一个个字节写入的,自然没有数组长度的问题.
二进制文件的一个重要特点是可以随机读写,通过文件指针定位,可以对文件中的任意位置进行读写操作.下面的例子改写第10个数据(从0开始为9),原来应该是9,现在改为99
Picture
上面的例子包括的读的操作,如果是数组,字符串包括长度,只要输入正确的数据类型,LV可以智能的自动计算长度,一次读取整个数组,看下图,一次读1028个字节,LV自动通过前四个字节确定数组的长度
Picture
可见,二进制文件非常灵活,可以存储任何类型的数据,关键是如何描述自己的数据结构,很多二进制文件在文件的头部增加一个文件头,用来描述文件的组成,比 如WINDOWS常见的BMP文件就是二进制文件,通过读取文件头来确定数据长度,颜色深度等信息,然后再读取整个数据.
Picture



Leave a Reply.