处理字串符的问题.
怎么判断一个String型变量zf中的字符类型?
比如.
zf里只能存在数字、":"、";"这三种元素.否则就提示数据错误.怎么弄?
[解决办法]
原理:
1、首先定义一个256个元素的布尔数组,将你需要的字符的Ascii编码对应的元素置为“真”
2、把你要检测的字符串转换成Ascii字节数组,然后用一个“真”值与所有字节对应的那个布尔数组元素做And运算。只要有一个对应的布尔值是“假”(意味着出现了你不需要的字符),则输出就全部为假。
这个办法看起来有点麻烦,但它的速度是最快的。
Private Sub Command1_Click() Dim tList_CheckOnlyHex() As Boolean Dim tList_CheckOnlyNum() As Boolean tList_CheckOnlyHex() = CreateWordsList("0123456789ABCDEF ") '获取一个16进制字符定义表(还记得你要的16进制函数吗?) tList_CheckOnlyNum() = CreateWordsList("0123456789:;") '获取一个数字和分隔符定义表 Debug.Print CheckWordsList("1232343:;", tList_CheckOnlyNum()) Debug.Print CheckWordsList("123A343:;", tList_CheckOnlyNum()) Debug.Print CheckWordsList("A1 32 F0 0F", tList_CheckOnlyHex()) Debug.Print CheckWordsList("A1 3G F0 0F", tList_CheckOnlyHex())End SubFunction CheckWordsList(ByRef pString As String, ByRef pWordList() As Boolean) As Boolean '根据一个Ascii编码定义表判断一个字符串的有效性 Dim tOutBool As Boolean '输出逻辑值 Dim tBytes() As Byte Dim tBytes_Index As Long tBytes() = StrConv(pString, vbFromUnicode) '取字符串的Ascii编码字节数组 tOutBool = Not pString = "" '输出逻辑值先预设为真(同时判断字符串是否为空) If tOutBool Then For tBytes_Index = 0 To UBound(tBytes()) tOutBool = tOutBool And pWordList(tBytes(tBytes_Index)) Next End If CheckWordsList = tOutBoolEnd FunctionFunction CreateWordsList(ByRef pWords As String) As Boolean() '根据一组Ascii字符串建立Ascii编码定义表 Dim tOutList() As Boolean '编码定义表 Dim tWords_Byte() As Byte '编码字符输入表 Dim tWords_Index As Long ReDim tOutList(255) 'Byte的取值0~255,每个值对应一个Boolean tWords_Byte() = StrConv(pWords, vbFromUnicode) '将Unicode的VB字符串转换为Ascii码。 For tWords_Index = 0 To UBound(tWords_Byte()) tOutList(tWords_Byte(tWords_Index)) = True '将pWords里出现的Ascii码对应定义位定义为真 Next CreateWordsList = tOutList()End Function
[解决办法]
鉴于你经常问一些关于字符串、串口通信和16进制之类的问题。下面告诉你一些有用的规律:
1、VB下的字符串可以和字节数组相互直接赋值。
Dim tBytes() As Byte
Dim tString As String
tBytes() = "小仙妹是个好孩子"
tString = tBytes()
2、VB下字符串是Unicode编码,所有字符均占用2个字节。Ascii半角字符也是如此,多余的那位是0。
Dim tBytes() As Byte
tBytes() = "ABCD"
你将得到8个元素(从0到7)的字节数组。
41 00 42 00 43 00 44 00
3、如果你想将Unicode转换为文本文件用的那种Ascii/GBK文本,则需要一个函数转换。
Dim tBytes() As Byte
tBytes() = Strconv("ABCD", vbFromUnicode)
你将得到4个元素(从0到3)的字节数组。
41 42 43 44
Ascii/GBK编码的字符串在VB下是乱码,无法正常显示。
4、如果你想将Ascii/GBK编码转换成VB下可以正常使用的Unicode编码字符串。则需要另一个转换。
Dim tBytes() As Byte
Dim tString As String
(从文本文件或串口获得Ascii编码的tBytes(),这里假设它等于41 42 43 44这四个字节)
tString = Strconv(tBytes(), vbUnicode)
你将得到字符串"ABCD"(如果你将它赋给一个字节数组,它有8个字节)
5、由于VB下使用Unicode,Ascii编码文本文件读到VB的字符串变量中都要进行一个编码转换。虽然你看不到,但实际上这个转换是在悄悄进行的。这个转换过程相当消耗时间,甚至比你操作这些字节的算法本身还要慢。
如果你用字符串方法去处理文本,程序要经历这些步骤:
Ascii文件——转换成Unicode——字符串操作——转换成Ascii编码——Ascii文件
如果你直接对Ascii字节操作(比如我给你的16进制字符串函数的Ascii模式),可以直接进行文件到文件的转换,而不需要在Unicode编码和Ascii编码之间来回转换。
Ascii文件——Byte数组操作——Ascii文件