加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在VB中将一字符串转存到Byte数组里的正确方法

发布时间:2020-12-16 22:32:44 所属栏目:大数据 来源:网络整理
导读:我们知道VB采用的Unicode的编码方式,在对外接口的时候就会出现一些问题,如调用API函数时或是和其它程序发送数据时就需要特别注意,因为它们不一定也是采用这样的编码方式,所以要将其转换,存储到一个Byte的数组里面,然后传递过去,才能得到正确的结果,否
我们知道VB采用的Unicode的编码方式,在对外接口的时候就会出现一些问题,如调用API函数时或是和其它程序发送数据时就需要特别注意,因为它们不一定也是采用这样的编码方式,所以要将其转换,存储到一个Byte的数组里面,然后传递过去,才能得到正确的结果,否则一旦传递了非英文的可打印字符时,程序将不会出现你想要的结果。我在编写一个网页时就遇到这样的问题,当中文数据被Post到一个网页时(Webbrowser控件),显示了乱码。我从网上查找资料,发现了这个问题的原因所在,也找到了转换函数PackBytes(),结果却发现这个函数有问题,现将其改正如下。 第一种方法是逐字转换,因为中文汉字的编码为GB2312,需要对其进行特别处理 Private Sub PackBytes(ByteArray() As Byte,ByVal PostData As String) Dim iNewBytes As Long '数组预设长度 Dim intAscii As Integer '一个字符(Unicode)的Asc编码,中文字符时其值小于0 Dim mCurNo As Integer '当前操作的Byte数组下标 Dim CharHex As String '当前操作字符的十六进制字符串 mCurNo = 0 iNewBytes = LenB(PostData) - 1 '字符串长度Len(str)的两倍注意用的是LenB()函数,数组下标从0开始,要减去1 If iNewBytes < 0 Then Exit Sub End If ReDim ByteArray(iNewBytes) For i = 0 To Len(PostData) ch = Mid(PostData,i + 1,1) '获取一个字符 If ch = Space(1) Then 如果是空跳过 ch = "+" End If If ch <> "" Then intAscii = Asc(ch) '取其Asc码 If intAscii > 0 Then '<0则为中文 ByteArray(mCurNo) = Asc(ch) '英文,直接取其Asc码 mCurNo = mCurNo + 1 '设置计数器 Else CharHex = Hex(intAscii) '中文时先转为十六进制 ByteArray(mCurNo) = HEX_to_DEC(Left(CharHex,2)) '将前两位转换为十进制,注意这里不用Cbyte()类型转换,因为一些非中文字符时会出现错误。 ByteArray(mCurNo + 1) = HEX_to_DEC(Right(CharHex,2)) '将后两位转换为十进制 mCurNo = mCurNo + 2 '设置计数器 End If End If Next i ReDim Preserve ByteArray(mCurNo - 1)'截掉多余的部分 End Sub Public Function HEX_to_DEC(ByVal Hex As String) As Long '将十六进制转换为十进制 Dim i As Long Dim B As Long Hex = UCase(Hex) For i = 1 To Len(Hex) Select Case Mid(Hex,Len(Hex) - i + 1,1) Case "0": B = B + 16 ^ (i - 1) * 0 Case "1": B = B + 16 ^ (i - 1) * 1 Case "2": B = B + 16 ^ (i - 1) * 2 Case "3": B = B + 16 ^ (i - 1) * 3 Case "4": B = B + 16 ^ (i - 1) * 4 Case "5": B = B + 16 ^ (i - 1) * 5 Case "6": B = B + 16 ^ (i - 1) * 6 Case "7": B = B + 16 ^ (i - 1) * 7 Case "8": B = B + 16 ^ (i - 1) * 8 Case "9": B = B + 16 ^ (i - 1) * 9 Case "A": B = B + 16 ^ (i - 1) * 10 Case "B": B = B + 16 ^ (i - 1) * 11 Case "C": B = B + 16 ^ (i - 1) * 12 Case "D": B = B + 16 ^ (i - 1) * 13 Case "E": B = B + 16 ^ (i - 1) * 14 Case "F": B = B + 16 ^ (i - 1) * 15 End Select Next i HEX_to_DEC = B End Function 第二种方法比较简单,用VB的内部函数StrConV() Private Sub PackBytes(ByteArray() As Byte,ByVal PostData As String) ByteArray() = StrConv(PostData,vbFromUnicode) End Sub 还原的时候只需用函数 strconv(bytearray(),vbunicode)就可以了

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读