召唤高人,求字符串算法

sss2002 2006-08-03 11:01:02
以下过程分别将字符串转成UNICODE代码,和逆算。
示例:

转换
字符串“召唤”————得到“53EC5524”

逆算
UNICODE代码“53EC5524”————字符串“召唤”


'将数据转成 UNICODE
Function Conv(KeyStr As String) As String
Dim Temp() As String, i As Long
Conv = ""
On Error Resume Next
ReDim Temp(Len(KeyStr) / 4 - 1)
For i = 0 To (Len(KeyStr) / 4) - 1
DoEvents
Temp(i) = Mid(KeyStr, 1 + 4 * i, 4)
Temp(i) = ChrW("&H" & Temp(i))
Conv = Conv & Temp(i)
Next
End Function


'将UNICODE 转成 数据
Public Function ConvUni(Str As String) As String
Dim a1 As String

Dim StrX As String, Intnums As Long, Stry As String

StrX = Str

For Intnums = 1 To Len(StrX)
DoEvents
a1 = Hex(AscW(Mid(StrX, Intnums, 1)))
If Len(a1) = 4 Then
Stry = Stry & a1
ElseIf a1 = "D" Or a1 = "A" Then
a1 = "000" & a1
Stry = Stry & a1
ElseIf Len(a1) = 2 Then
a1 = "00" & a1
Stry = Stry & a1
End If
Next Intnums
ConvUni = Stry

End Function


现在由于转换的数据量比较大,在转换 100K 数据的时候,要2分钟,求高人给出优化的代码。
可以用 API。
期待高人显身.........
...全文
237 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
fxy_2002 2006-08-03
  • 打赏
  • 举报
回复
解码过程也用一样的原理,只要避开字符串在循环中连接就行了。

VB的字符串速度连接极慢,所以本版有高人写过高效字符串连接类,用的就是数组,可以搜一下学习学习。
fxy_2002 2006-08-03
  • 打赏
  • 举报
回复
这是我的测试代码:e:\tmp\test.txt 是一个113,454 字节(110K)的文本文件。

即使加上写入过程,在我的这台老式p3电脑上用时也不需要1秒。

另外提醒一句:如非必要,不要在循环中使用 doevents,这会极大降低效率。

Sub test()
Dim xx As String, yy() As Byte
Open "e:\tmp\test.txt" For Binary As #1
ReDim yy(LOF(1) - 1)
Get #1, , yy
Close #1

xx = StrConv(yy, vbUnicode)

Dim zz As String
Debug.Print Now()
zz = ConvUni(xx)

Open "e:\tmp\test2.txt" For Output As #1
Print #1, zz
Close #1
Debug.Print Now()

End Sub

fxy_2002 2006-08-03
  • 打赏
  • 举报
回复
你这个主要是循环中字符连接比较耗时,请使用数组放每个字的十六进制代码,最后再连接成一个字符串。

Public Function ConvUni(Str As String) As String
Dim a1 As String

Dim StrX As String, Intnums As Long
Dim Stry() As String

StrX = Str

ReDim Stry(1 To Len(StrX))
For Intnums = 1 To Len(StrX)
'DoEvents
a1 = Hex(AscW(Mid(StrX, Intnums, 1)))
If Len(a1) = 4 Then
ElseIf a1 = "D" Or a1 = "A" Then
a1 = "000" & a1
ElseIf Len(a1) = 2 Then
a1 = "00" & a1
End If
Stry(Intnums) = a1
Next Intnums
ConvUni = Join(Stry, "")

End Function

用上面这个代码,编码一个110K 的文件在我的 p3 600 上用时少于1秒
sss2002 2006-08-03
  • 打赏
  • 举报
回复
mustudent(小生--蚕豆)

什么绑定?
  • 打赏
  • 举报
回复
数据辆大的
就不好解决了
mustudent 2006-08-03
  • 打赏
  • 举报
回复
綁定
sss2002 2006-08-03
  • 打赏
  • 举报
回复
谢谢楼上的,可我要得到的是 码值,比如“我”,码值为 6211
迈克揉索芙特 2006-08-03
  • 打赏
  • 举报
回复
StrConv 函数的语法为:StrConv(待转换字串, 转换格式)

其中转换格式在这里用到的是:

vbUnicode 将 Ansi 字串转换为 Unicode

vbFromUnicode 将 Unicode 字串转换为 Ansi
fxy_2002 2006-08-03
  • 打赏
  • 举报
回复
http://blog.csdn.net/viena

sss2002 2006-08-03
  • 打赏
  • 举报
回复
非常感谢 fxy_2002(阿勇)

这正是我需要的。

在本版没有找到你的说高效字符串连接类,能帮忙给个地址吗?

7,785

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧