在VB中将一字符串转存到Byte数组里的正确方法
来源:互联网 发布:java 支付宝转账 编辑:程序博客网 时间:2024/05/17 19:16
我们知道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)就可以了
第一种方法是逐字转换,因为中文汉字的编码为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)就可以了
- 在VB中将一字符串转存到Byte数组里的正确方法
- 在VB中将一字符串转存到Byte数组里的正确方法
- 在VB中把字符串转换成Byte数组
- VB.NET中将结构体保存到文件的方法
- VB.NET中将结构体保存到文件的方法
- VB 字节数组和字符串的转换问题 (String<>Byte)
- playframework中将log输出到文件里的配置方法
- 几种字符串到byte[] 数组转化为String 的方法
- 几种字符串到byte[] 数组转化为String 的方法
- PPT控件Spire.Presentation 教程:在VB.NET中将HTML字符串附加到PPT中
- Js中将字符串转为对象或数组的方法
- c# byte数组转存本地图片
- 关于VB的Byte数组的初始化
- 从图像转换到byte[]数组的几种方法
- 从图像转换到byte[]数组的几种方法
- java接收到的byte数组转成16进制字符串和16进制字符串转byte数组
- VB.NET中将结构体保存到文件的方法(转)
- Python中将字符串里的Unicode字节转成相应的中文的方法
- Linux那些事儿之我是Hub(3)一样的精灵不一样的API
- ado.net c#.net2005 From第一讲(BindingDemoForm9)
- 基于文件流的文件隐藏技术
- 用Ajax技术让IE Web Control Tree View实现大数据量读取 【原文】
- [建模]使用Visio 2000逆向工程将代码转换为UML图表
- 在VB中将一字符串转存到Byte数组里的正确方法
- MYSQL into outfile注射---条件
- B/S下C#的提示信息
- winform程序中如何跨线程修改控件的值
- ISBN、一个18位身份证和计算信用卡(Luhns)的算法
- 采用spring的Log4jConfigListener配置log4j
- ado.net c#.net2005 From第一讲(BindingDemoForm10)
- Spring 要点总结
- 个人关于Cemail.vol 文件的研究心得