11
社区成员




作者:昨夜星辰
思路:
1、通过网上查阅的资料可知,汉字的Unicode编码范围为十六进制4E00~9FA5。
2、通过Randomize及Rnd函数,生成一个在汉字编码范围内的数字。
3、通过ChrW函数得到编码数字对应的汉字。
注:十六进制数4E00~9FA5,亦可写为十进制数19968~40869,出于教学目的,本帖不应用十进制写法。
由于涉及十六进制数,故需要用到&H来将十六进制转换为十进制。所以,在写代码之前,我们需要弄懂下面几点。
什么是十六进制数?
十六进制是一种基数为16的计数系统,是一种逢16进1的进位制。通常用数字0、1、2、3、4、5、6、7、8、9和字母A、B、C、D、E、F表示,其中A~F表示10~15,这些称作十六进制数。
十六进制数的应用范围?
在按键精灵中十六进制主要用于memory地址及RGB图色数据。图色数据可参考:【源码+思路】计算偏色之RGB篇
&H的作用是什么?
可以通过在数字前面添加前缀&H来表示十六进制数。例如,在十六进制计数法中,&H10表示十进制数16。亦可通过Hex函数将十进制数转换为十六进制数,例如Hex("16")得到十进制数10。
但是在使用&H时有一点务必要注意,&H是根据你输入的数据来自动调整数据为整型或长整型,而十六进制是由补码的方式来表达负数。规则为负数的补码是它本身的值每位求反,最后再加1。在整型情况下,十进制数24667的十六进制为605B,-24667则为9FA5。而长整型情况下,十进制数24667的十六进制为0000605B,-24667则为FFFF9FA5。比如&H9FA5,按照我们的想法应该得到十进制的40869,但却得到了-24667。通过TypeName(&H9FA5)可知返回的是整型(Integer),而非长整型(Long),故而发生了错误。解决方案是在数据末尾再加一个&,即&H9FA5&,其作用是将数据强制按照长整型进行运算,如此以来便能得到正确的结果。
注:0000605B亦可写作605B,&H9FA5&亦可写作&H00009FA5&,数字中前端的0可忽略。
源码:
Function 随机生成汉字(位数)
随机生成汉字 = ""
For 位数
随机生成汉字 = 随机生成汉字 & ChrW(生成随机数(&H4E00&, &H9FA5&))
Next
End Function
Function 生成随机数(num1, num2)
Dim L, U
L = num1
U = num2
If num1 > num2 Then
L = num2
U = num1
End If
Randomize
生成随机数 = CLng(Int((U - L + 1) * Rnd + L))
End Function
调用方法:
TracePrint 随机生成汉字(6)
调试结果:
脚本 我的脚本.Q ,第1行:匑鷳请媖鴔躕