首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

处理字串符的有关问题

2012-01-19 
处理字串符的问题.怎么判断一个String型变量zf中的字符类型?比如.zf里只能存在数字、:、这三种元素.否

处理字串符的问题.
怎么判断一个String型变量zf中的字符类型?
比如.
zf里只能存在数字、":"、";"这三种元素.否则就提示数据错误.怎么弄?

[解决办法]
原理:
1、首先定义一个256个元素的布尔数组,将你需要的字符的Ascii编码对应的元素置为“真”
2、把你要检测的字符串转换成Ascii字节数组,然后用一个“真”值与所有字节对应的那个布尔数组元素做And运算。只要有一个对应的布尔值是“假”(意味着出现了你不需要的字符),则输出就全部为假。

这个办法看起来有点麻烦,但它的速度是最快的。

VB code
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文件

热点排行