科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件浅议VB6字节数组和字符串的相互转换

浅议VB6字节数组和字符串的相互转换

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

数据类型转换在编程中经常用到,VB6提供了一整套类型转换的函数

作者:朱先中 来源:天极网 2007年10月14日

关键字: VB 字节数组 字符串 相互转换

  • 评论
  • 分享微博
  • 分享邮件
一、 前言

  数据类型转换在编程中经常用到,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

  在上面这段代码中,字符串参数lpBuffer返回Windows的系统路径。在函数调用之前,将变量预定义成256个字符,并在函数返回时清除多余的字符。

  注意:

  在调用API函数之前,通常都需要预先定义一个字符串或者Byte数组以供API函数存储数据。应该养成这种良好的编程习惯。否则,你的程序有可能崩溃,甚至导致你的系统崩溃。

  下面是使用Byte数组的代码:

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

  不知道读者注意到没有,第二段代码中的GetSystemDirectory API函数的声明已经改变了。第一个参数的声明由一个ByVal字符串变成了一个ByRef的Byte数组,即由声明:

ByVal lpBuffer As String

  变成了:

ByRef lpBuffer As Byte

  传递字符串时,需要一个ByVal修饰符来把字符串缓冲区传递到API函数中,因为字符串变量实际上指示了字符串内容所在的内存地址。在C语言术语中,这代表了一个指向指针的指针。ByVal意味着被传递的是一个指向实际字符串内容的内存地址。而在传递Byte数组Buffer(0)时,使用ByRef修饰符来传递变量,它相当于传递了数组中第一个字节内容的地址。事实上,这两种结果是一样的。

strA=StrConv(Buffer,vbUnicode)

  这行代码把Byte数组的二进制数据转换成一个合法的Visual Basic字符串。

  三、 Byte数组和字符串之间的赋值

  为了简化Byte数组和字符串之间的数据传递,允许你在任何动态Byte数组和任何字符串之间直接互相赋值。例如:

Buffer=strA

StrA=Buffer

  注意:

  当且仅当Byte数组是动态的,而不是固定大小时,你才可以把一个字符串直接赋给一个Byte数组。

  声明一个动态的Byte数组最简单的方法是在Dim语句中使用空参数,例如:

Dim Buffer() as Byte

  当你把一个字符串赋给一个动态Byte数组时,数组中的字符数将是字符串的字符数目的两倍。这是因为Visual Basic中字符串使用Unicode,并且每个Unicode字符的实际大小是两个字节。当把一个ASCII字符转换成一个Byte数组时,数组中的另一个字节将是0。

  向Unicode的转换是将每个在缓冲区中的字符转换成2个字节,从而实际上加倍了存储在结果字符串的中字节数目,当你认为函数Len(strA)得到的尺寸大小和Unicode转换后的Ubound(Buffer)函数所返回的尺寸大小相同时,上述特点就不很明显了。但是,函数LenB(strA)确实返回一个2倍于Len(strA)返回值的数值。这是因为Len函数返回的是字符串中字符的数目,而LenB函数返回的是字符串中字节的数目。一个Unicode串的字符长度仅仅是该串中实际字节数目的一半,这是因为每个Unicode字符2个字节。
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章