第28卷 第3期
2004年6月
测 井 技 术
Vol.28 No.3Jun2004
WELLLOGGINGTECHNOLOGY
文章编号:1004-1338(2004)03-0225-03
VB指针高级应用与测井LA716数据解编
王 涛,黄玉海
(中原油田分公司油藏监测研究中心,河南濮阳457001)
摘要:通过对VB(VisualBasic)指针应用的详细阐述和对测井LA716数据文件的详细剖析,给出了用VB对工作站
LA716测井数据文件解编和数据转换的方法。
关键词:VB;测井数据;LA716数据;指针;浮点数据中图分类号:TP368.5;TP274.2 文献标识码:A
UsingPointerinVBProgrammingandDecodingLA716DataFormat
WANGTao,HUANGYu2hai
(ReservoirMonitoring&ResearchCentreofZhongyuanOilfieldSubsidiary,Puyang,Henan457001,China)
Abstract:DetailestheuseofpointerinVB(VisualBasic)programming.GiveshowtodecodetheLA716dataformatfromWorkstationtoPCbythispointerinVB.AndthestructureofLA716dataisdescribedaswell.
Keywords:VisualBasic;logdata;LA716data;pointer;floatdata
0 引 言
LA716数据格式是Atlas公司在测井界常用的数据
1 测井LA716数据文件
1.1 LA716格式
LA716文件由标题块和数据块组成。标题块只有1个,记录一些说明性信息;数据块记录测井数据,1个
记录格式之一。各油田因各种原因对LA716的标题块信息进行了不同程度的调整和增删,PC计算机与SUN工作站对浮点数据在存储体中的存放格式也不同。应用LA716数据,特别是在PC机与SUN工作站之间交换数据时必须对数据进行格式转换和解编。
VisualBasic是基于Basic语言,由微软公司开发。
文件可能包含多个数据块;每个数据块由多个逻辑记录组成,逻辑记录数为测井曲线条数,1个逻辑记录记录的是1个井段内同一测井曲线值,不同数据块中逻辑记录数是一样的,逻辑记录(对应测井曲线)的顺序是一定的,具体顺序由标题信息决定。LA716文件记录格式见图1。
与以往的Basic语言不同的是,VB是由事件驱动的程序编写模式,它提供了快速开发程序的环境,可视化的开发界面让不熟悉视窗操作系统程序开发的人员易于上手。VB同时也是多种应用软件的程序化引擎,如Of2fice、Visio、AutoCAD等等,它们都利用VBA(VisualBasicforApplication)来建立程序化控制的应用基础,也就是在Office内也可以编写程序,而程序语言编写的环境和语法都与VB相似。但由于VB语言缺少了C语言非常强大的指针功能,应用中总存在一些难以解决的问题,而这些问题在C语言中却很容易实现。经过长时间摸索,找出了VB指针的应用方法,并将其应用于LA716测井数据的转换中。
图1 LA716文件记录格式
© 1995-2006 Tsinghua Tongfang Optical Disc Co., Ltd. All rights reserved.
・226・测 井 技 术 2004年
不同的用户根据具体要求对LA716文件的结构作适当的修改,如标题块信息内容、逻辑记录的长度、每个数据块所允许的最多曲线条数等。
1.2 微机浮点数据格式与工作站浮点数据格式的区别
Intel系列的处理器存储方式(地址由低到高)与工
关于指针变量的声明,用一个32位长整数来表达
指针就行。在VB里就是用Long型来明确地声明指针,不用区分是普通指针、无类型指针还是函数指针,通通都可用Long来声明。给一个指针赋值,就是赋给它用VarPar得到的另一个变量的地址。
有了CopyMemory,VarPtr函数,就可以像C语言一样进行指针操作了(包括大部分基本类型的指针),例如,用VB实现各种指针:
TypePOINT
作站处理器存储方式(地址由高到低)的差别决定了浮点数据在存储设备中的差别,所以17.625的float在工作站中的储存格式为418D0000,而在IntelCPU的存储体中则是按00008D41的顺序存放。因此,在PC机与工作站之间进行数据交换时必须进行数据转换。
XAsInteger YAsInteger
EndType
PublicFunctionCompare(elem1AsLong,elem2AsLong)AsLong//
EndFunction
FunctionFnPtrToLong(ByVallngFnPtrAsLong)AsLong
2 VB指针高级应用
VB中没有指针的概念。而C和C++其指针的使
用则是基本功。它是一个32位的整数,在C语言和在VB里都可以用Long类型来表示。在32位Windows平
台下它和普通的32位长整型数没有什么不同,只不过它的值是一个内存地址,正是因为这个整数像针一样指向一个内存地址,所以就有了指针的概念。
其实,在VB中有3个没有公开的函数VatPtr、
StrPtr、ObjPtr(VB开发商不鼓励用指针,所以要隐藏),实际上这3个函数在VB运行时库MSVBVM60.DLL(或MSVBVM50.DLL)中是同一个函数VarPtr,VarPtr返回的是变量所在处的内存地址,也可以说返回了指向变量内存位置的指针,它是在VB里处理指针最重要的武器之一,其在VB里用API方式声明这几个函数。
PrivateDeclareFunctionObjPtrLib“MSVBVM60”Alias“VarP2tr”(varAsObject)AsLong
PrivateDeclareFunctionVarPtrLib”MSVBVM60”(varAsAny)AsLong
FnPtrToLong=lngFnPtr
EndFunctionSubPtrDemo()
DimlAsLong,cAsByte,ca()AsByte,PtAsPOINT DimplAsLong,pcAsLong,pvAsLong,pPtAsLong,
pfnCompareAsLong(X”) c=AscB“
pl=VarPtr(l)//对应C里的long、int型指针 pc=VarPtr(c)//对应char、short型指针 pPt=VarPtr(Pt)//结构指针
pv=VarPtr(ca(0))//字节数组指针,可对应任何类型,也就是void3
pfnCompare=FnPtrToLong(AddressOfCompare)注释:函数指针
CopyMemoryc,ByValpc,LenB(c)//用指针取值
(Y”),LenB(c)//用指针赋 CopyMemoryByValpc,AscB“
VB不直接支持指针操作,在VB里用指针取值和
用指针赋值都必须用CopyMemory这个API函数,是它让32位的VB实现了内存移动。
CopyMemory是定义在Kernel32.dll中的RtlMove2MemoryAPI,32位C函数库中的memcpy也是这个API
值
pc=pc+LenB(c):pl=pl-LenB(l)//指针移动
EndSub
的包装,它的功能是将从Source指针所指处开始的长度为Length的内存拷贝到Destination所指的内存处。它不管程序有没有读写该内存所应有的权限,一但它想读写被系统所保护的内存时,就会得到著名的AccessVio2lationFault(内存越权访问错误),甚至会引起更著名的generalprotection(GP)fault(通用保护错误)。在VB里
上面的例子基本上已经包括了能在VB里进行的所有指针操作。它将给我们带来意想不到的方便。
3 测井LA716数据解编
工作站格式的LA716文件中标题块中的浮点数据和每个数据块中的测井曲线值要转换为PC微机格式的浮点数据可以考虑2种方法。3.1 依靠磁盘文件实现转换
用API方式声明如下:
PrivateDeclareSubCopyMemoryLib“kernel32”Alias“Rtl2MoveMemory”(ByValDestinationAsLong,ByValSourceAsLong,ByValLengthAsLong)
把自定义数据结构的变量(或Byte数组变量)中的数据顺序颠倒并存入一个用Binary方式打开的数据文
© 1995-2006 Tsinghua Tongfang Optical Disc Co., Ltd. All rights reserved.
第28卷 第3期 王 涛,等:VB指针高级应用与测井LA716数据解编・227・
件,然后用对应的浮点型变量读出,即可实现转换。该方法的缺点是频繁与磁盘文件交换数据,因而效率较低,运行速度较慢。3.2 利用指针技术进行内存拷贝实现转换
利用上述的VB指针的高级应用技巧,在内存中进行浮点数据格式的转换,不但效率高而且方法简单(其实,用VC等语言编写测井数据转换软件也是基于该指针方法)。首先定义一个包含4个Byte(字节类型,占1个字节)型变量的结构或Byte数组变量,用它读取指定位置的浮点数据,此时,结构中4个Byte变量中保存的是与PC计算机浮点数据字节颠倒的内容,利用指针技术把它们中的内容反向排列,并赋值给一个Single(单精度类型,占4个字节)型的变量即可。
′定义结构
PrivateTypewt1
图2 测井二次解释成果图
Get#1,417,RLEV
by1AsByte by2AsByte by3AsByte by4AsByte
EndType
′转换SUN浮点数
stdep=swap(stdep)edDEP=swap(edDEP)RLEV=swap(RLEV)
′转换函数
PrivateFunctionSwap(dataAsSingle)AsSingle
Dimb1Aswt1 Dimbb1AsLong Dimda1AsLong bb1=VarPtr(b1) da1=VarPtr(data) CopyMemorybb1,da1,4 Dima1Aswt1 Dimaa1AsLong a1.by1=b1.by4 a1.by2=b1.by3 a1.by3=b1.by2 a1.by4=b1.by1 aa1=VarPtr(a1) CopyMemoryda1,aa1,4 swap=data
EndFunction
4 数据解编在测井二次解释中的应用
中原油田测井公司的测井资料都是在SUN工作站上进行处理和解释的,因而产生的LA716文件也是
SUN工作站格式的。
基于上述第2种方法编写的软件已经广泛应用在中原油田的测井资料二次处理解释工作中和测井数据库的建立和管理工作中,软件可实现数据的批量转换和解编,使得相关的测井和地质研究项目可快速获得所需的数据。解释成果见图2。
5 结束语
用VB对工作站LA716数据文件解编是行之有效的方法,让不具备指针功能的VB具有了指针功能。即使只具备VB编程语言的测井专业人员也可以随心所欲地对LA716数据文件进行解编和转换。参考文献:
[1] 雍世和,张超谟.测井资料数字处理与综合解释[M].北
′主程序
DimstdepAsSingleDimedDEPAsSingleDimRLEVAsSingle
京:石油大学出版社,1998.
[2] AdamBear(原作).VB真是想不到系列之二,VB葵花宝典
′读取浮点数
Get#1,409,stdepGet#1,413,edDEP
———指针技术.www.csdn.net网站.
(修改稿收稿日期:2003-12-18 本文编辑 李总南)
© 1995-2006 Tsinghua Tongfang Optical Disc Co., Ltd. All rights reserved.
第28卷 第3期作 者 简 介・A1・
© 1995-2006 Tsinghua Tongfang Optical Disc Co., Ltd. All rights reserved.