LabVIEW工控二进制数据存储
在文件存储的逻辑上,二进制文件基于值编码,而不是字符编码,其占用空间小,读取/写入速度快,但是译码比较复杂,不利用数据共享。根据具体编码方式的不同,二进制的使用方式也有所不同,如对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工控二进制数据存储的更多相关文章
- MYSQL C API : mysql_real_escape_string 二进制数据存储
#include <iostream> #include <string> #include <string.h> #include <mysql.h> ...
- IOS 数据存储(NSKeyedArchiver 归档篇)
什么是归档 当遇到有结构有组织的数据时,比如字典,数组,自定义的对象等在存储时需要转换为字节流NSData类型数据,再通过写入文件来进行存储. 归档的作用 之前将数据存储到本地,只能是字符串.数组.字 ...
- LabVIEW(四):数据存储和文件IO
1.使用NI数据采集板卡来进行数据保存和文件I/O操作.2.在一个典型的测试测量系统当中,包括:信号调理.信号采集.信号分析.信号显示.数据存储.数据存储:将采集到的数据储存到磁盘上,以备日后离线分析 ...
- 数据库中用varbinary存储二进制数据
问题描述:将图片.二进制文件内容等数据存储在数据库中,并能从数据库中取出还原为图片或文件,数据库存储二进制数据用varbinary字段. 分析:由于之前数据库中没有用过varbinary存储数据,首先 ...
- SQLite数据库如何存储和读取二进制数据
SQLite数据库如何存储和读取二进制数据 1. 存储二进制数据 SQLite提供的绑定二进制参数接口函数为: int sqlite3_bind_blob(sqlite3_stmt*, int, co ...
- mssql sqlserver 可以存储二进制数据的字段类型详解
转自: http://www.maomao365.com/?p=6738 摘要: 下文将从数据库的数据类型着手,剖析在sqlserver数据库中可以存储二进制数据的数据类型,如下所示: mssql s ...
- DevExpress XtraScheduler日程管理控件应用实例(2)-- 深入理解数据存储
DevExpress年终击穿底价,单套授权低至67折!查看详情>>> 在上篇随笔<DevExpress XtraScheduler日程管理控件应用实例(1)-- 基本使用> ...
- python django中使用sqlite3数据库 存储二进制数据ByteArray
在python中使用sqlite3数据库存储二进制流数据ByteArray,在django使用sqlite3数据库时,有时候也要注意最好使用二进制流ByteArray插入字符串. 使用ByteArra ...
- mysql 存储二进制数据
晚上小研究了下MySQL存储于读取二进制数据的功能.关键步骤为以下三点: 最重要的一点:存储二进制数据的表的类型需要是blob类型(按长度不同分为tiny, media, long) 插入二进制数据时 ...
随机推荐
- WSGI与uWSGI的应用场景与使用方法
WSGI /与/ uWSGI 在阿里云上部署项目时,在通信中我们都会用到wsgi与uWSGI,这此我就带大家来了解一下wsgi与uWSGI. 对了,上次有个朋友问我Django的生命周期是什么?我 ...
- centos7编译安装Zabbix-4.2.4及设置邮件告警教程(超详细每步都有截图)
Zabbix-4.2.4安装及配置 此安装基于centos7的LNMP环境下,如未安装LNMP还可参考本人其他随笔 第一步:上传下载 1.前往https://www.zabbix.com/downlo ...
- cocos2d-x 新工程的把玩
创建了cocos的工程以及初步了解了工程的结构之后,可以尝试自己改改代码了 游戏窗口的设置 首先是AppDelegate,找到AppDelegate.cpp中AppDelegate::applicat ...
- 资深程序员告诉你为什么要用Python3而不是Python2
经常遇到这样的问题:<现在开始学习python的话,是学习python2.x还是学习python3.x比较好?>,这也是许多初学者会遇到的问题,我们的答案是python 3.x. 为了帮助 ...
- 如何获取input,file里的文件,实现预览效果,并传给后端?
单纯的事件与获取 <input type="file" name="file" id="fileUpload"> <img ...
- HTML 文件路径
文件路径描述了网站文件夹结构中某个文件的位置. 文件路径会在链接外部文件时被用到: 网页 图像 样式表 JavaScript 绝对文件路径 绝对文件路径是指向一个因特网文件的完整 URL: 实例 &l ...
- JS-字符串截取方法slice、substring、substr的区别
一.使用 slice() 截取 1,函数说明 slice() 方法可通过指定的开始和结束位置,提取字符串的某个部分,并以新的字符串返回被提取的部分.语法如下: stringObject.slice(s ...
- linux环境下卸载oracle 11g
1.停库[oracle@testdb ~]$ sqlplus / as sysdbaSQL> shutdown immediateDatabase closed.Database dismoun ...
- 工作日志,证书无效 unable to find valid certification path to requested target
工作日志,证书无效 unable to find valid certification path to requested target 最近被这个问题弄得头大.导致所有用到 se.transmod ...
- Linux:RPM安装工具的使用
RPM安装工具的使用 RPM包管理工具介绍 RedHat 软件包管理工具(RedHat Package Manager,RPM) RPM 软件包工具常用于软件包的安装.查询.更新升级.校验.卸载以及生 ...