论文部分内容阅读
摘要:本文利用PB BLOB可以操作二进制大对象的特点,借助PB内置函数对PB的位操作能力进行了函数封装,扩展了PB的位操作能力并给出了在图像处理和工业控制中的应用实例。
关键词:PowerBuilder;二进制大对象;位操作;图像;工业控制
中图分类号:TP311.56 文献标识码:A文章编号:1009-3044(2007)05-11195-03
1 引言
PB作为一个开发工具,一直是以开发数据库管理信息系统见长的。但在图像处理和工业控制软件开发过程中,由于都涉及到数据按位操作,PB就无能为力了(当然可借助其他语言进行扩展),因为PB不具备位处理能力。从PB 6.5一直到现在普遍使用的PB 9.0,一直没有提供有关位处理的相关函数。本文则借助和利用PB提供的某些函数的特殊属性,成功地对PB位处理函数进行了扩充并对其进行了函数封装,从而使PB具备了位处理能力。
2 PB位操作所涉及的三个技术问题
常见的位操作主要有五种:位检测操作、位与操作、位或操作、位非操作和位异或操作。但要在PB中实现这些功能,以下的三个技术问题必须解决。
首先解决的是,PB中字节数据类型的存储问题。我们知道,PB本身不具备位处理能力,也没有提供字节这一数据类型。但是PB提供了BLOB这一数据类型,BLOB (Binary Large Object),中文称二进制大对象。与常见的数据类型不同,它是一种用于存储没有边界的数据。它的大小长度变化很大,在PB中,BLOB数据类型的长度可以从0个字节到4294967295个字节。BLOB数据类型具有特殊性,它可以包含一些特殊的控制字符,例如,0x00,在很多编程语言中该控制字符用于表示字符串的结束[1]。由于BLOB型变量的这些特点,使得BLOB数据类型可以处理无法用常规数据类型(例如字符型、数字型、逻辑型等)进行表示并加以处理的数据,诸如较长的备注,详细的说明,数字照片,图像,声音,视频流等特殊的数据类型[2]。而且BLOB数据类型是可以按字节进行分割的。这样就解决了PB中字节数据类型的存储问题。
其次,所要解决的是整型数据(0-255)和BLOB数据类型的相互转换问题。在许多高级语言中,字节类型是一种整形,其范围是从0到255。在PB中,使用char()函数可以将一个整型数据(0-255之间)转换为ASCII字符,然后通过blob()函数可以将字符(实际上是借助字符串实现的)转换成BLOB类型;反之,通过string()函数也可以将BLOB型数据转换为字符串型数据,再通过asc()将一个ASCII码字符转换为整型数据(0-255之间)。这样就解决了整型(0-255)和BLOB数据类型的相互转换问题,如图1所示。
最后,所要解决的问题是控制字符(0x00)的存储问题。同许多高级语言不同,PB将字符看作字符串的特例,采用相同的处理机制。PB将0x00字符看作空字符串(0x00字符在PB中求得的长度是0个字节),而空字符在PB中是不记入字符串的长度的。这同大多数高级语言所求得的结果不同。以下给出VB、Delphi、PB三种语言中处于等价地位的代码来验证我们的说法:
但当0x00字符在字符串中出现时,在0x00字符之后的字符串都将被PB忽略。例如,对于字符串"~hFF~h00~hFC",PB按"~hFF"来处理,转换为BLOB数据类型只能得到一个字节;对于"~hFF"+"~h00"+"~hFC",PB按"~hFF~hFC"处理,转换为BLOB数据类型只能得到两个字节。这样0x00的存储就存在问题。不过在PB中,可以通过指定BLOB数据类型的预分配空间来解决0x00的存储问题。例如,上述的字符串"~hFF~h00~hFC"可以通过下面的方法,被PB正确处理:
这样就解决了控制字符(0x00)的存储问题。
图1 整型数据(0-255)和BLOB数据类型的相互转换关系
3 对PB BLOB数据类型位处理函数的封装
在解决上面三个问题的基础上,我们实现了对位操作函数的封装,我们总共封装了9个函数,他们分别是:
函数f_bittest()用于测试一个字节的BLOB数据类型的某一位是否为1;
函数f_notblob()用于处理位操作的非操作;
函数f_andblob()用于处理位操作的与操作;
函数f_orblob()用于处理位操作的或操作;
函数f_xorblob()用于处理位操作的异或操作;
函数f_shlblob()用于处理位操作的左移操作;
函数f_shrblob()用于处理位操作的右移操作;
函数f_blob2ulg()用于正序或者逆序求出BLOB型数据对应的10进制;
函数f_ulg2blob()用于正序或者逆序写入10进制对应的BLOB型数据。
上述函数均是借助对整数的处理而间接实现的,由于版面有限,在本文中,我们只给出f_xorblob()实现的代码和例子:
4 图像处理方面的应用
图像处理是PB的一个薄弱环节,而借助上面封装的位处理函数可以实现PB在图像上的操作。以下给出一段程序代码,其程序代码的作用是将一段位图数据嵌入到一个位图文件的信息头,从而将该位图文件位图数据进行隐藏。我们所用到的图片是Bubbles.bmp图片(16色位图,位图大小是64x64,大小为2118字节),如图2所示;我们同样做了一个同样大小的图片(16色位图,位图大小是64x64),如图3所示,图片显示的内容作为我们的隐藏信息。
图2 用于提取位图数据的图片(1.bmp) 图3 待隐藏的图片(2.bmp)
以下给出将2.bmp隐藏在1.bmp 中具体实现的程序代码:
该程序代码所生成的图片,在正常情况下所显示的效果同图2;当文件在Windows画图板中不经任何修改,再保存成新的文件,再在画图板中打开时,显示的效果同图3,即将隐藏信息显示出来了。
5 工业控制领域的应用
在工业控制领域经常要处理的信号是开关量信号,例如开关的闭合与断开,指示灯的亮与灭,继电器和接触器的吸合与释放,马达的启动与停止,阀门的打开与关闭等,这些信号都可以用二进制数据位表示。在大多数情况下,多个二进制数据位组成一个字节或字进行压缩存储,以节省存储空间。借助上面封装的位操作函数,可以对采集到(或存储)的二进制数据进行分析,并进行逻辑操作,从而实现PB对开关量信号的控制(或分析)。
以下给出一段程序代码,用于说明上述位操作函数对开关信号量的控制,其中blobvar是采集到的一字节二进制状态信号。程序片断的功能是对blobvar的第7位进行测试(对于1个字节,从右到左分别是第0位到第7位),如果第7位为1,则对第6位进行置0,如果第7位为0,则将第6位置1。
6 结语
对PB位操作函数的封装,不但促进了PB在图像处理和工业控制领域的应用,而且也可应用于其它领域,从而提升了PB这一以数据库应用软件开发工具在其它领域的广泛适应性。
参考文献:
[1]袁梅宇.基于动态链接库进行BLOB数据交换的方法[J].微计算机应用,2000,21(3):242-244.
[2]高毅龙,侯成刚.大数据块的存储与访问方案[J].计算机工程,1999,25(11):88-89.
[3]于海生.微型计算机控制技术[M].北京:清华大学出版社,1999.18-21.
本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。
关键词:PowerBuilder;二进制大对象;位操作;图像;工业控制
中图分类号:TP311.56 文献标识码:A文章编号:1009-3044(2007)05-11195-03
1 引言
PB作为一个开发工具,一直是以开发数据库管理信息系统见长的。但在图像处理和工业控制软件开发过程中,由于都涉及到数据按位操作,PB就无能为力了(当然可借助其他语言进行扩展),因为PB不具备位处理能力。从PB 6.5一直到现在普遍使用的PB 9.0,一直没有提供有关位处理的相关函数。本文则借助和利用PB提供的某些函数的特殊属性,成功地对PB位处理函数进行了扩充并对其进行了函数封装,从而使PB具备了位处理能力。
2 PB位操作所涉及的三个技术问题
常见的位操作主要有五种:位检测操作、位与操作、位或操作、位非操作和位异或操作。但要在PB中实现这些功能,以下的三个技术问题必须解决。
首先解决的是,PB中字节数据类型的存储问题。我们知道,PB本身不具备位处理能力,也没有提供字节这一数据类型。但是PB提供了BLOB这一数据类型,BLOB (Binary Large Object),中文称二进制大对象。与常见的数据类型不同,它是一种用于存储没有边界的数据。它的大小长度变化很大,在PB中,BLOB数据类型的长度可以从0个字节到4294967295个字节。BLOB数据类型具有特殊性,它可以包含一些特殊的控制字符,例如,0x00,在很多编程语言中该控制字符用于表示字符串的结束[1]。由于BLOB型变量的这些特点,使得BLOB数据类型可以处理无法用常规数据类型(例如字符型、数字型、逻辑型等)进行表示并加以处理的数据,诸如较长的备注,详细的说明,数字照片,图像,声音,视频流等特殊的数据类型[2]。而且BLOB数据类型是可以按字节进行分割的。这样就解决了PB中字节数据类型的存储问题。
其次,所要解决的是整型数据(0-255)和BLOB数据类型的相互转换问题。在许多高级语言中,字节类型是一种整形,其范围是从0到255。在PB中,使用char()函数可以将一个整型数据(0-255之间)转换为ASCII字符,然后通过blob()函数可以将字符(实际上是借助字符串实现的)转换成BLOB类型;反之,通过string()函数也可以将BLOB型数据转换为字符串型数据,再通过asc()将一个ASCII码字符转换为整型数据(0-255之间)。这样就解决了整型(0-255)和BLOB数据类型的相互转换问题,如图1所示。
最后,所要解决的问题是控制字符(0x00)的存储问题。同许多高级语言不同,PB将字符看作字符串的特例,采用相同的处理机制。PB将0x00字符看作空字符串(0x00字符在PB中求得的长度是0个字节),而空字符在PB中是不记入字符串的长度的。这同大多数高级语言所求得的结果不同。以下给出VB、Delphi、PB三种语言中处于等价地位的代码来验证我们的说法:
但当0x00字符在字符串中出现时,在0x00字符之后的字符串都将被PB忽略。例如,对于字符串"~hFF~h00~hFC",PB按"~hFF"来处理,转换为BLOB数据类型只能得到一个字节;对于"~hFF"+"~h00"+"~hFC",PB按"~hFF~hFC"处理,转换为BLOB数据类型只能得到两个字节。这样0x00的存储就存在问题。不过在PB中,可以通过指定BLOB数据类型的预分配空间来解决0x00的存储问题。例如,上述的字符串"~hFF~h00~hFC"可以通过下面的方法,被PB正确处理:
这样就解决了控制字符(0x00)的存储问题。
图1 整型数据(0-255)和BLOB数据类型的相互转换关系
3 对PB BLOB数据类型位处理函数的封装
在解决上面三个问题的基础上,我们实现了对位操作函数的封装,我们总共封装了9个函数,他们分别是:
函数f_bittest()用于测试一个字节的BLOB数据类型的某一位是否为1;
函数f_notblob()用于处理位操作的非操作;
函数f_andblob()用于处理位操作的与操作;
函数f_orblob()用于处理位操作的或操作;
函数f_xorblob()用于处理位操作的异或操作;
函数f_shlblob()用于处理位操作的左移操作;
函数f_shrblob()用于处理位操作的右移操作;
函数f_blob2ulg()用于正序或者逆序求出BLOB型数据对应的10进制;
函数f_ulg2blob()用于正序或者逆序写入10进制对应的BLOB型数据。
上述函数均是借助对整数的处理而间接实现的,由于版面有限,在本文中,我们只给出f_xorblob()实现的代码和例子:
4 图像处理方面的应用
图像处理是PB的一个薄弱环节,而借助上面封装的位处理函数可以实现PB在图像上的操作。以下给出一段程序代码,其程序代码的作用是将一段位图数据嵌入到一个位图文件的信息头,从而将该位图文件位图数据进行隐藏。我们所用到的图片是Bubbles.bmp图片(16色位图,位图大小是64x64,大小为2118字节),如图2所示;我们同样做了一个同样大小的图片(16色位图,位图大小是64x64),如图3所示,图片显示的内容作为我们的隐藏信息。
图2 用于提取位图数据的图片(1.bmp) 图3 待隐藏的图片(2.bmp)
以下给出将2.bmp隐藏在1.bmp 中具体实现的程序代码:
该程序代码所生成的图片,在正常情况下所显示的效果同图2;当文件在Windows画图板中不经任何修改,再保存成新的文件,再在画图板中打开时,显示的效果同图3,即将隐藏信息显示出来了。
5 工业控制领域的应用
在工业控制领域经常要处理的信号是开关量信号,例如开关的闭合与断开,指示灯的亮与灭,继电器和接触器的吸合与释放,马达的启动与停止,阀门的打开与关闭等,这些信号都可以用二进制数据位表示。在大多数情况下,多个二进制数据位组成一个字节或字进行压缩存储,以节省存储空间。借助上面封装的位操作函数,可以对采集到(或存储)的二进制数据进行分析,并进行逻辑操作,从而实现PB对开关量信号的控制(或分析)。
以下给出一段程序代码,用于说明上述位操作函数对开关信号量的控制,其中blobvar是采集到的一字节二进制状态信号。程序片断的功能是对blobvar的第7位进行测试(对于1个字节,从右到左分别是第0位到第7位),如果第7位为1,则对第6位进行置0,如果第7位为0,则将第6位置1。
6 结语
对PB位操作函数的封装,不但促进了PB在图像处理和工业控制领域的应用,而且也可应用于其它领域,从而提升了PB这一以数据库应用软件开发工具在其它领域的广泛适应性。
参考文献:
[1]袁梅宇.基于动态链接库进行BLOB数据交换的方法[J].微计算机应用,2000,21(3):242-244.
[2]高毅龙,侯成刚.大数据块的存储与访问方案[J].计算机工程,1999,25(11):88-89.
[3]于海生.微型计算机控制技术[M].北京:清华大学出版社,1999.18-21.
本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。