一、 前言
数据类型转换在编程中经常用到,vb6提供了一整套类型转换的函数。但是,在进行类型转换时,有时候仅仅依靠vb提供的函数是不能达到自己的目的的。因此,需要考虑用其他的方法来完成数据类型转换。 本文仅谈vb6中字节数组和字符串的相互转换过程中应注意的问题及其解决办法。
在visual basic中使用byte数组主要是为了32位api函数的参数传递和函数的返回。在32位的visual basic版本中,字符串被假定为unicode字符,其中每个字符占用两个字节。系统自动地将unicode的两个连续字节转换成1个字节的ansi字符。但是,如果该字符串包含二进制数据,其内容将变得很难理解。例如,一个汉字是两个字节,在visual basic 6.0中的长度就只是1,这将给我们计算单个汉字的国标码带来一些麻烦。有了byte数组,这些问题就将迎刃而解。
另外,visual basic中的字符串和c语言中的字符串有一些不同,本文将给出一个函数,把c字符串转换成visual basic字符串。
二、 用byte数组代替字符串
byte数组包含的是0-255之间的ascii码字符,它不会象字符串那样被系统作预处理。你可以在很多api函数中用来byte数组代替字符串。
例如,下面的代码中用getsystemdirectory这个windows api函数来取得windows的系统路径。一共有两段代码,一段代码是传递一个字符串来存储函数返回的系统路径,另一段代码是传递一个byte数组来代替字符串。
为了更好地比较,两段代码的不同部分都用黑体标出。读者可以仔细比较这两段代码的差异,这样您会更深入地理解byte数组和字符串的差别。
把这两段代码的任何一段放入一个窗体中运行,但击窗体的空白区域,你将会在窗体中看到windows的系统路径。
下面是使用字符串的代码:
| private declare function getsystemdirectory lib "kernel32" alias _ "getsystemdirectorya" (byval lpbuffer as string, byval nsize as long) as long private sub form_click() dim n as integer dim str as string str = space$(256) n = getsystemdirectory(str, 256) str = left$(str, n) print str end sub |
| private declare function getsystemdirectory lib "kernel32" alias _ "getsystemdirectorya" (byref lpbuffer as byte, byval nsize as long) as long private sub form_click() dim n as integer dim buffer() as byte dim stra as string buffer=space$(256) n = getsystemdirectory(buffer(0), 256) stra=strconv(buffer,vbunicode) stra = left$(stra, n) print stra end sub |
| byval lpbuffer as string |
| byref lpbuffer as byte |
| stra=strconv(buffer,vbunicode) |
| buffer=stra stra=buffer |
| dim buffer() as byte |
| dim sapireturn as string sapireturn=space$(256) sapireturn=api_function(…) |
| public function cstringtovbstring(pscstring as string) as string ‘参数pscstring是一个待转换的c字符串 ‘函数返回null左边所有的字符 dim sreturn as string dim inullcharpos as integer inullcharpos=instr(pscstring,vbnullchar) if inullcharpos >0 then sreturn =left(pscstring, inullcharpos -1) else sreturn =pscstring end if cstringtovbstring=sreturn end function |
| public sub multicstringtostringarray(psmulticstring as string, psastrings() as string) '参数psmulticstring是待转换的多个c字符串 '参数psastrings是返回的vb字符串数组,调用之前它必须是一个动态的空数组 ' dim inullpos as integer dim iprevpos as integer dim iidx as integer '初始化字符串数组 iidx = 0 redim psastrings(0 to iidx + 1) psastrings(iidx + 1) = "" do ' inullpos = instr(iprevpos + 1, psmulticstring, vbnullchar) if inullpos > iprevpos + 1 then '把找到的c字符串赋值给字符串数组 psastrings(iidx) = mid$(psmulticstring, (iprevpos + 1), ((inullpos - 1) - iprevpos)) iidx = iidx + 1 redim preserve psastrings(0 to iidx) iprevpos = inullpos else '找到了两个null字符,去掉最后一个,然后退出 redim preserve psastrings(0 to iidx - 1) exit do end if loop end sub |
| option explicit |
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器