'******************************************************* Do nlen = Len(astr1) '得出10进制的长度 p = Int((nlen - 1) / 4) '得出数字占数组的个数(减去1代表数组单元的下标),每4位数占一个数组单元 i = 0 k = 1 Do alen = Len(astr1) If alen <= 4 Then k = 2 x(i) = astr1 Else x(i) = Right(astr1, 4) '每次从低位取4位 astr1 = Mid(astr1, 1, alen - 4) End If i = i + 1 Loop While k = 1 '完成数据向数组的装入,每个单元为字符串,是从低位向高位的顺序 strnext = "" strtmp = "" modtmp = "" r = 1 '前导去0标志 '*************************************************** For z = p To 0 Step -1 '从最后一位,也是10进制数的最高位开始 modtmp1 = CStr(CLng(modtmp + x(z)) Mod 16) '模作为与下一个数组单元相接合,再求模,直到这后的模 strtmp = CStr(Int(CLng(modtmp + x(z)) / 16))
If Len(strtmp) < 4 And r <> 1 Then '补0也是为了下次大循环的运算,如果是第一个值就不用被0了 For i = 1 To 4 - Len(strtmp) strtmp = "0" + strtmp Next i End If
strnext = strnext + strtmp '得到除以16的商,准备用下一次大循环的运算初始值 modtmp = modtmp1 r = 2 Next z '***************************************************
lastmod = Hex(Int(modtmp)) + lastmod '其实这就是16进制数了,不用再反向了 astr1 = strnext i = 1 Do '前导去0循环 nlen = Len(astr1) If Left(astr1, 1) = "0" Then astr1 = Right(astr1, nlen - 1) Else Exit Do End If i = i + 1 Loop While i <= Len(astr1)
If Len(astr1) <= 2 Then '因为前已经加成4个0了,对循环退出的判断 If Len(astr1) = 0 Then '防止到下面来个CInt(astr1)类型不符 Exit Do End If If CInt(astr1) < 16 Then Exit Do End If End If Loop '***************************************************** If Len(astr1) = 0 Then laststr = lastmod Else laststr = Hex(CInt(astr1)) + lastmod End If