PDA

View Full Version : Ai giúp e sửa lỗi overflow với



programmer94
28-06-2010, 19:33
Đây là mã mà bạn em gửi cho e:


Public Function hash2(u As String)
Dim c0(1 To 5) As Long
Dim c1(1 To 5) As Long
Dim c2(1 To 5) As Long
c0(1) = &H1E3B3FC1
c0(2) = &H1DF3B767
c0(3) = &H44A8B8A
c0(4) = &H17D5806
c0(5) = &H76B7B269
c1(1) = &H1F6AC727
c1(2) = &H36AFFA23
c1(3) = &H2A44C357
c1(4) = &H6852B1BD
c1(5) = &H5741B66
c2(1) = &H5FBCAA08
c2(2) = &H280A0FA
c2(3) = &H3B24050
c2(4) = &H1DB11700
c2(5) = &H24B8F0D8
Dim w(1 To 8) As Long
Dim wi(1 To 8) As Long
w(1) = &H3A7FBE09
w(2) = &H24B8F0D8
w(3) = &H308C5262
w(4) = &H57A3960
w(5) = &H56710E56
w(6) = &H1E0D7519
w(7) = &H1DF38361
w(8) = &H17D2FCA
Const md = &H7FFFFFFF
Dim a(1 To 8) As Long
a(1) = &H7EF27A7
a(2) = &H1AC069B2
a(3) = &H2DBB992F
a(4) = &H1598A1E9
a(5) = &H28D78FFD
a(6) = &H4D8EB0
a(7) = &H13509CBF
a(8) = &HEC974FD
Dim h(1 To 8) As Long, r0, s As Double, m As Double
s = Len(u)
If s Mod 32 > 0 Then
u = u & String(32 - s Mod 32, Chr(0))
s = s + 32 - s Mod 32
End If
s = Len(u) / 32
For i = 0 To s - 1
For j = 0 To 7
r0 = ""
For k = 1 To 4
q = DecToBin(Asc(Mid(u, i * 32 + j * 4 + k, 1)))
If Len(q) < 8 Then q = String(8 - Len(q), "0") & q
r0 = r0 & q
Next
r0 = BinToDec(r0)
If r0 > md Then r0 = md - r0
wi(j + 1) = r0
Next
For j = 1 To 7
a(j) = (rol(wi(j), 3) Xor w(j)) Xor a(j)
a(j + 1) = rol(wi(j) Xor w(j), 5) Xor a(j + 1)
Next

a(8) = (rol(wi(8), 5)) Xor w(8) Xor a(8)
For j = 1 To 5
i1 = (rol(a(1), 3) Xor rol(a(1), 12))
i2 = a(2) Xor (a(3) And a(4))
i3 = a(3) And (a(4) Xor (Not a(1)))
m = CDbl(i1) + i2 + i3 + c0(j)
a(4) = md2(m)
i4 = (rol(a(6), 9) Xor rol(a(6), 13))
i5 = a(7) Xor (a(8) And a(6))
i6 = a(6) And (a(8) Xor Not (a(7)))
m = CDbl(i4) + i5 + i6 + c1(j)
a(5) = md2(m)
i7 = a(4) Xor (Not (a(3)) And a(2))
i8 = a(6) Xor (Not (a(8)) And a(7))
m = CDbl(a(8)) + c2(j) + i7 + i8
a(8) = md2(m)
For k = 1 To 7
a(k) = a(k + 1)
Next
Next
For j = 1 To 8
m = CDbl(h(j)) + a(j)
h(j) = md2(m)
Next
Next
For i = 1 To 8
s = dectohex(h(i))
if len(s)<8 then s=string(8-len(s),"0")
hash2 = hash2 & s
Next
End Function

Public Function rol(ByVal m, k As Long)
If m < 0 Then m = m + 2 ^ 32
s = DecToBin(m)
If s = "" Then s = "0"
If Len(s) < 32 Then s = s & String(32 - Len(s), "0")
s = Right(s, k) & Left(s, Len(s) - k)
rol = BinToDec(s)
If rol > &H7FFFFFFF Then rol = rol - 2 ^ 32
End Function

Public Function md2(n)
If n > &H7FFFFFFF Then
n = n - 2 ^ 32
ElseIf n < -&H7FFFFFFF Then
n = n + 2 ^ 32
End If
md2 = n
End Function

Public Function DecToHex(ByVal n)
If n < 0 Then n = 2 ^ 32 + n
Dim stri(0 To 15) As String
For i = 0 To 15
stri(i) = Hex(i)
Next
While n > 0
u = n / 16
u = (u - Int(u)) * 16
s = stri(Int(u)) & s
n = Int(n / 16)
Wend
DecToHex = s
End Function


Ko rõ tại sao dòng bôi đậm cứ báo overflow vậy? Ai biết chỉ giùm e với.