在文件存储的逻辑上,二进制文件基于值编码,而不是字符编码,其占用空间小,读取/写入速度快,但是译码比较复杂,不利用数据共享。根据具体编码方式的不同,二进制的使用方式也有所不同,如对bmp格式,规定了文件各个字节段/块的含义,只需要按照相应的编码方式进行解码就可以得到bmp文件的内容。因此,使用记事本是无法查看bmp的内容的(无法解码bmp文件),只能使用专门的图像查看软件。事实上,任何程序员都可以按照自己的方式自定义二进制文件的编码方式,并提供相应的解码模块将信息从二进制文件中提取出来即可。 与文本文件的读写方式类似,LabVIEW中的二进制文件的读写采用图 10所示的两个函数完成:“Write To Binary File”和“Read From Binary File”。这两个函数是多态函数,可以接受File Refnum和File Path两种输入。其使用方式也与文本文件的两个VI类似,本文不再赘述,仅仅说明其特殊的参数和使用方法。

图 10 File I/O选板

图 11所示为利用Write To Binary File.vi函数将一个数组以二进制文件存储。首先,程序使用10次的FOR循环以产生0~9的数列并将其转换为U8类型的数组;然后将这个数组存入二进制文件中。图 11所示为利用Write To Binary File.vi函数将一个数组以二进制文件存储。首先,程序使用10次的FOR循环以产生0~9的数列并将其转换为U8类型的数组;然后将这个数组存入二进制文件中。

图 11 使用Write To Binary File.vi函数

如果计算该文件的大小,可以很容易的得到:10*1 Byte(U8)=10 Bytes,即10字节。打开该文件的“属性”对话框,如图 12所示,显示文件大小为14字节。那么多余的4字节是怎么产生的呢?这与Write To Binary File.vi函数的“prepend array or string size (T)”参数有关,它表示当输入端的数据类型是数组或字符串时是否在文件头包含该数组的大小或字符串的长度,默认是True。该长度通过一个32 bits(4 Bytes)的整型表示,因此当往二进制文件中写入数组和字符串时,可以决定是否需要将大小和长度信息写入文件头。

图 12 test.dat文件属性

从上面可知,通过读取test.dat文件的前4个字节获取字符串的长度或数组的大小,如图 13所示

图 13 获取test.dat文件的大小

在Write To Binary File.vi和Read From Binary File.vi中,均包含一个byte order参数。这实际上就是常说的“大小头”问题,比如U16占有2个字节,是前面的字节占高的内存地址,还是后面的字节占高的内存地址。由于不同的操作平台对该问题有不同的处理方式,因此使用时需要显式地指定,只需要写入和读取时一一对应即可,一般保持默认值。

为了说明数据结构对二进制文件的影响,本文将使用一个比较复杂的数据类型写入二进制文件,如图 14所示。实例中使用簇的数组类型,在簇中依次包含了double、string、I32和2个I32型数据组成的数组元素。

图 14 写入二进制文件

根据LabVIEW数据类型的定义方式,可以计算单个簇元素的大小是:8 Bytes(double)+5 Byte(string,其中4个字节表示字符串长度)+4 Bytes(I32)+12 Bytes(Array of I32,其中4个字节表示数组的长度)=29 Bytes,整个文件的大小是29 Bytes*10+4 Bytes(表示数组的长度)=294 Bytes。因此,test.dat文件的格式如图 15所示

图 15 test.dat文件的格式

根据图 15的文件组成,可以获取数组的第6个簇元素的值,如图 16所示。首先读取test.dat的前4个字节获取整个数组的长度;然后,将文件指针移动到第6个元素的开头;最后,读取第6个数据元素即可得到数组中的第6个元素。显然,如果程序员不知道test.dat中的字节存储情况,是无法获取第6个元素值的

图 16 获取test.dat文件中数组的第6个元素

综上所述,二进制文件由于其高速、高效的特点在高速流盘、安全存取方面应用广泛。同时,由于其无法被常用的字符处理程序直接读取,因此无法便捷地查看数据,而只能通过专用的应用程序读取。此外,对特有的数据结构而言,二进制文件需要非常了解该数据结构的内存占用情况才能够准确检索和定位。

通常,为了识别二进制的基本信息,程序员往往会在文件的头部增加一些基本的头文件信息,用来描述文件的组成。如bmp格式文件在头部使用14个字节表示文件信息以及40个字节表示位图信息,这些信息使得程序员可以快速地获取bmp文件的字节大小、位图像素、分辨率、颜色等相关信息。

最新文章

  1. js小练习去掉指定的字符组成一句话输出
  2. C# Azure 存储-队列
  3. ubunt14.04 安装JDK
  4. 烂泥:学习mysql的binlog配置
  5. 给定金额m和红包数量n
  6. MVC-Html.Label(TextBox、TextArea、RadioButton、CheckBox)
  7. 实时消息传输协议 RTMP(Real Time Messaging Protocol)
  8. JavaScript设计模式_10_职责链模式
  9. php curl实现get和post请求
  10. JAVA中double类型运算结果异常的解决
  11. 【原创】大数据基础之ElasticSearch(3)升级
  12. webpack(4)-管理输出
  13. 2019 To do List
  14. 插件使用一树形插件---zTree
  15. 年终培训关于磁盘冗余阵列、热备、群集、负载均衡、云计算、F5、Nginx等的概念和基本原理
  16. 查看手机cpu信息
  17. Tomcat禁用SSLv3和RC4算法
  18. PHP-不同Str 拼接方法性能对比
  19. 一个简单例子弄懂什么是javascript函数劫持
  20. git ——本地项目上传到git

热门文章

  1. 【Linux命令】用户身份(useradd,groupadd,usermod,passwd,userdel)
  2. PHP ThinkPHP 非常好用的增删改查方法
  3. (五十九)c#Winform自定义控件-池子(工业)-HZHControls
  4. Java生鲜电商平台-商城优惠券设计要点复盘与总结
  5. Unitest自动化测试基于HTMLTestRunner报告案例
  6. 数据处理之以OLEDB方式读取Excel数据丢失的原因及解决方法
  7. 记录NodeJs常用工具
  8. Django使用xadmin集成富文本编辑器Ueditor(方法二)
  9. STM32F373(青风)+CUBEMX快速上手
  10. go语言设计模式之adapter