|

- UID
- 238
- 帖子
- 20
- 积分
- 20
- 港币
- 55436 元
- 性别
- 男
- 在线时间
- 0 小时
- 注册时间
- 2003-4-17
- 最后登录
- 2003-4-19
|
1楼
发表于 2003-4-18 20:25
| 只看该作者
你想的通吗。想不通来这这。
假如一个很大的字符串需要进行一些复杂的加密或解密运算或是对它的某个字符进行操作替换的话,把它放进传统的STRING型变量里进行操作可不太适合。一来是修改里面的字符相当麻烦,二来是操作速度也很慢。
# H4 X& v5 l% T7 T/ K5 Z. N
( {/ x3 k% F- |9 N8 Q2 f因此就需要一种比较快而高效的方法。
" S2 X# O4 o9 ]; `5 P$ |6 G( g$ n5 Q: ?: t
BYTE型数组就能很好的解决这个问题(只能使用BYTE型的。假如你想兼容普通TEXTBOX的显示的话)
2 l: x9 R5 u" m$ f$ r1 `( ^5 R1 L& U比如说我要对一个字符串中的每个字符的ASCII或UNICODE值+1的话,普通做法是用个循环,不断的用MID分离出一个字符,再用ASC函数取得它的值对它+1,再把它使用CHR还原到TEXTBOX中。那么假如这个字串大的话,你会发现,转换速度会越来越慢,到最后一秒钟是转不了几个字符的(即使你在转换过程中禁止了TEXTBOX的刷新也是如此)。但假如用BYTE型数组操作就不同了。
& A% P0 W' o( k" {5 ?, [7 B y; A8 y4 j0 J- G v$ |5 l/ G
比如说要对“示例代码”这是个字进行存放。那么请看下面的代码:
/ ~% ^8 j/ A$ \. K% O- f2 Pdim WordString() as byte 0 |4 Q- K) {2 a* g
WordString="示例代码" ’BYTE型数组能很好兼容TEXTBOX的显式方式。也能很好兼容普通字串存放方式 r) v2 O3 C% W7 U
3 }3 z+ D! b) {+ R3 C这两句代码中,就等于把一个"示例代码" 这四个字存进了一个String型的变量。不同的是它比STRING变量更好操作。因为操作数组是相当灵活的,它允许你更改其中某个原素的值而不必更改整个变量的值。这点是STRING型变量无法替代的。而且使用BYTE型数组的更大好处是完全兼容TEXTBOX的显示方式!根本不必作任何转换,直接使用代码: , z- U/ h) W% J# Y+ [% K
textbox1.text=WordSting
( H" x% T- J4 ?; H2 r就能让这个BYTE型数组中存放的字符显示出来。 - B2 o% q$ _4 M' f
这就避免了对字串操作中频繁把操作后的字串存储于TEXTBOX中所浪费的时间了。因为我们完全可以让这个数组变量在数组中进行操作后再让TEXTBOX中一次性显示出来。其中节约的时间是巨大的。
4 J( T) \3 o" ?, Z& p Q3 F5 C/ T$ d, a2 ~
在使用BYTE型数组操作字串有几点知识要掌握的: ) t: Z& Z G" g) |( f9 X t1 K, B
一般情况下从代码中读取的字串或是从资源文件中读取的字串全是以UNICODE形式存放的。也主是说一个字符会占用两个字节。而BYTE型数组一个元素为1个字节。就等于一个字符占用两个元素。因此要操作一个字符需要对它的两个原素进行操作。存放于数组中的形式与UNICODE存放于文件中的形式是一样的。大家可以参考我的个人文集中的关于UNICODE、DBCS码的那篇文章。
: s6 l7 v1 w4 k( u6 X, r5 g! k/ O8 j" {! |. ~: K
) |& u% E* c1 p7 f* \* Q
$ H4 d8 S& t2 E8 Q1 T9 v3 A
1 b8 s) M3 ^; p, x) J
( g, t. ]3 ^& z0 j# f1 t* F4 i! b使用BYTE型数组操作字串的好处例子:
! p9 ~0 D! i H4 z y! `- [比如需要对字串中第100个、1000个或是任何一个位置的字符进行覆盖。而且替换的字符长度不一。那如果使用STRING型的变量存放字符,这是不可想象的。字串大的话这要消耗相当多的时间与内存。使用BYTE型数组操作则可以轻松解决此问题。因为它可以方便覆盖它的某个元素的值。配合Copymemory使用效果极佳! 0 X5 r4 c0 j7 {7 d
比如说有一个="这是示例代码!"的字串,现需要对它的第三个字符起进行覆盖。示例代码如下: R. s5 l# K3 }# \
# b. |+ a4 A* j ?: ddim WordString() as byte ’这是原字串
" R3 W! H! n O& O+ b8 nWordString="这是示例代码!" + L( j, X: m- M, e" ^0 R5 y
dim WordString2() as byte ’这是要覆盖的字串
/ g8 {" D/ ]) D8 YWordString2="程序"
4 g! b1 o: e/ \# ^8 Vcopymemory WordString(4),WordString2,len(WordString2) 1 S" d, S! K( W* V4 G4 X0 Y# n6 ^4 b
’Copymemory是一个API函数,声明自己在APIVIEW中查找。因为第三个字符存放于数组中的元素位置是4,所以让它从WORDSTRING(4)的地址处开始覆盖 1 i- \1 P |$ T! h: u
4 Q5 U8 R5 ?3 ?1 @3 g& \$ o% i) ]( j& E8 O/ ?( x5 Y
以上就完成了覆盖的操作了。而且并未用到任何中间变量。而使用STRING变量来操作的话,效率绝对没有这段代码高!大家可以去试试。建议把字符加多一些,覆盖的字符也多一些。因为字符太少可能看不出效率。 9 O$ M" A5 Q9 \# ]5 i8 \
3 d& l- ?# a6 i1 G: v% I1 j5 j* Y7 Q/ D" t9 U$ {: g4 O
( V1 q6 B! u$ W6 D
这篇文章主要给出的不是代码,而是一种思路。希望大家能了解
5 c5 f- W/ l' M$ V7 `如果有什么不了解的地方,请在回贴中提出。我尽我所能来解答。 + O& u5 }" V- L
9 v0 g/ ?, b' ~% U3 [9 P2 j& ]6 r: y/ e( {9 N- F/ ?
* Y. |, u8 c5 x8 c+ [5 n7 M附:或许有人对我的代码中使用了COPYMEMORY进行覆盖有些质疑,认为即使用COPYMEMORY来对STRING变量操作也能达到这个效果。但是这是不可能的!大家试试便知了。 |
|
中时空网络(http://www.3cts.com)提供优质的虚拟主机服务 |
|