在文件存储的逻辑上,二进制文件基于值编码,而不是字符编码,其占用空间小,读取/写入速度快,但是译码比较复杂,不利用数据共享。根据具体编码方式的不同,二进制的使用方式也有所不同,如对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文件的字节大小、位图像素、分辨率、颜色等相关信息。

LabVIEW工控二进制数据存储的更多相关文章

  1. MYSQL C API : mysql_real_escape_string 二进制数据存储

    #include <iostream> #include <string> #include <string.h> #include <mysql.h> ...

  2. IOS 数据存储(NSKeyedArchiver 归档篇)

    什么是归档 当遇到有结构有组织的数据时,比如字典,数组,自定义的对象等在存储时需要转换为字节流NSData类型数据,再通过写入文件来进行存储. 归档的作用 之前将数据存储到本地,只能是字符串.数组.字 ...

  3. LabVIEW(四):数据存储和文件IO

    1.使用NI数据采集板卡来进行数据保存和文件I/O操作.2.在一个典型的测试测量系统当中,包括:信号调理.信号采集.信号分析.信号显示.数据存储.数据存储:将采集到的数据储存到磁盘上,以备日后离线分析 ...

  4. 数据库中用varbinary存储二进制数据

    问题描述:将图片.二进制文件内容等数据存储在数据库中,并能从数据库中取出还原为图片或文件,数据库存储二进制数据用varbinary字段. 分析:由于之前数据库中没有用过varbinary存储数据,首先 ...

  5. SQLite数据库如何存储和读取二进制数据

    SQLite数据库如何存储和读取二进制数据 1. 存储二进制数据 SQLite提供的绑定二进制参数接口函数为: int sqlite3_bind_blob(sqlite3_stmt*, int, co ...

  6. mssql sqlserver 可以存储二进制数据的字段类型详解

    转自: http://www.maomao365.com/?p=6738 摘要: 下文将从数据库的数据类型着手,剖析在sqlserver数据库中可以存储二进制数据的数据类型,如下所示: mssql s ...

  7. DevExpress XtraScheduler日程管理控件应用实例(2)-- 深入理解数据存储

    DevExpress年终击穿底价,单套授权低至67折!查看详情>>> 在上篇随笔<DevExpress XtraScheduler日程管理控件应用实例(1)-- 基本使用> ...

  8. python django中使用sqlite3数据库 存储二进制数据ByteArray

    在python中使用sqlite3数据库存储二进制流数据ByteArray,在django使用sqlite3数据库时,有时候也要注意最好使用二进制流ByteArray插入字符串. 使用ByteArra ...

  9. mysql 存储二进制数据

    晚上小研究了下MySQL存储于读取二进制数据的功能.关键步骤为以下三点: 最重要的一点:存储二进制数据的表的类型需要是blob类型(按长度不同分为tiny, media, long) 插入二进制数据时 ...

随机推荐

  1. 《Netty Redis Zookeeper 高并发实战》声明

    疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列 [博客园总入口 ] 这里, 对疯狂创客圈 <Netty Redis Zookeeper 高并发实战> 一书,进行一些必要说明. ...

  2. Java中String直接赋字符串和new String的一些问题

    今天课堂测试做了几道String的练习题,做完直接心态爆炸...... 整理自下面两篇博客: https://www.cnblogs.com/marsitman/p/11248001.html htt ...

  3. .net core web api 添加对session跨域实现

    1.配置Startup /ConfigureServices添加: services.AddSession(options => { options.Cookie.Name = ".A ...

  4. Oracle数据库之第一篇

    1 : Oracle 简介 : 是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器IP,端口,用户名.密码,点击:连接 (CLIENT/SERVER) ...

  5. Windows7中启动Mysql服务时提示:拒绝访问的一种解决方式

    场景 在Windows7中打开任务管理器--服务下 找到mysql的服务点击启动时提示: 拒绝访问 这是因为权限不够导致的不能启动sql服务. 点击 任务管理器右下角的服务 在这里就可以正常启动服务

  6. Supply Initial Data提供初始数据 (EF)

    Open the Updater.cs (Updater.vb) file, located in the MySolution.Module project's Database Update fo ...

  7. 【C#】学习笔记(4) 值类型和引用类型相关(Null相关)

    Reference and Value Types Value Types(值类型): struct(结构体) 独立的实例或者是拷贝 值的改变不会影响其它拷贝 值就是它所代表的信息 没有引用,所以不可 ...

  8. dedecmsV5.7 arclist 如何调用副栏目的文章

    问题:用arclist 调用某个栏目下的文章的时候,发现无法调用出副栏目是这个栏目的文章. 然后就上百度搜了一番,记录一下我搜到的解决方法: 1.打开/include/taglib/arclist.l ...

  9. JavaScript 是如何运行的?

    摘要: 理解JS执行原理. 原文:JavaScript 是如何运行的? 作者:hengg Fundebug经授权转载,版权归原作者所有. 什么是JavaScript? 我们来确认一下JavaScrip ...

  10. 高通平台开机LOGO修改LK(bootloader)下实现【转】

    网络上已经有许多在kernel中修改开机Logo的文章,本文就LK下实现开机logo进行简述 需要用到ffmpeg工具,没有安装ffmpeg请参考这里: http://blog.csdn.net/re ...