【IT168技术文档】
因项目需求的原因,需要一个获取google pagerank值的VB类.
网上查了半天,仍然只查到C#版,,同时我也是C#出身,对VB.NET一点都不熟悉,但无奈形式比人强,一点一点改吧. 于是有了下面的代码.
因为对VB.NET不熟悉,所以做得很是艰难;而在转换代码的过程中,发现自己对C#最基本的语法运算符等其实也远远不够熟悉.,BS自己一百遍啊一百遍.要加强学习了.
C#版的代码并没有作者信息,同时我也忘记了从哪儿下载到的.程序中有个网址链接,但在博客园发布时提示是违禁内容.在此声明,非原创,不过从C#描述转为VB.NET描述而已.
下面是类代码:
1Imports System 2 3Public Class CheckSumClass CheckSum 4 Public Const GOOGLE_MAGIC As UInt32 = 3862272608 5 6 Private Function zeroFill()Function zeroFill(ByVal a As UInt32, ByVal b As Integer) As UInt32 7 Dim z As UInt32 = 2147483648 8 If (Convert.ToBoolean(z And a)) Then 9 a = (a >> 1) 10 a = a And (Not z) 11 a = a Or &H40000000 12 a = (a >> (b - 1)) 13 Else 14 a = (a >> b) 15 End If 16 Return a 17 End Function 18 19 Private Function mix()Function mix(ByVal a As UInt32, ByVal b As UInt32, ByVal c As UInt32) As UInt32() 20 a = ReduceUInt32(a, b) 21 a = ReduceUInt32(a, c) 22 'a ^= Convert.ToUInt32(zeroFill(c, 13)) 23 'a = PowerValue(a, Convert.ToUInt32(zeroFill(c, 13))) 24 a = a Xor zeroFill(c, 13) 25 26 b = ReduceUInt32(b, c) 27 b = ReduceUInt32(b, a) 28 'b ^= Convert.ToUInt32(a << 8) 29 b = b Xor (a << 8) 30 31 c = ReduceUInt32(c, a) 32 c = ReduceUInt32(c, b) 33 'c ^= Convert.ToUInt32(zeroFill(b, 13)) 34 c = c Xor zeroFill(b, 13) 35 36 a = ReduceUInt32(a, b) 37 a = ReduceUInt32(a, c) 38 'a ^= Convert.ToUInt32(zeroFill(c, 12)) 39 a = a Xor zeroFill(c, 12) 40 41 b = ReduceUInt32(b, c) 42 b = ReduceUInt32(b, a) 43 'b ^= Convert.ToUInt32(a << 16) 44 b = b Xor (a << 16) 45 46 c = ReduceUInt32(c, a) 47 c = ReduceUInt32(c, b) 48 'c ^= Convert.ToUInt32(zeroFill(b, 5)) 49 c = c Xor zeroFill(b, 5) 50 51 a = ReduceUInt32(a, b) 52 a = ReduceUInt32(a, c) 53 'a ^= Convert.ToUInt32(zeroFill(c, 3)) 54 a = a Xor zeroFill(c, 3) 55 56 b = ReduceUInt32(b, c) 57 b = ReduceUInt32(b, a) 58 'b ^= Convert.ToUInt32(a << 10) 59 b = b Xor (a << 10) 60 61 c = ReduceUInt32(c, a) 62 c = ReduceUInt32(c, b) 63 'c ^= Convert.ToUInt32(zeroFill(b, 15)) 64 c = c Xor zeroFill(b, 15) 65 66 Dim returnArray() As UInt32 = {a, b, c} 67 68 Return returnArray 69 End Function 70 71 Private Function GoogleCH()Function GoogleCH(ByVal url As UInt32(), ByVal length As UInt32, ByVal init As UInt32) As UInt32 72 If length = 0 Then 73 length = Convert.ToUInt32(url.Length - 1) 74 End If 75 76 Dim a As UInt32 = 2654435769 77 Dim b As UInt32 = 2654435769 78 Dim c As UInt32 = init 79 Dim k As Integer = 0 80 Dim len As UInt32 = length 81 Dim m_mix(3) As UInt32 82 83 While len >= 12 84 'a += Convert.ToUInt32(url(k + 0) + (url(k + 1) << 8) + (url(k + 2) << 16) + (url(k + 3) << 24)) 85 a = AddUInt32(a, Convert.ToUInt32(url(k + 0) + (url(k + 1) << 8) + (url(k + 2) << 16) + (url(k + 3) << 24))) 86 b = AddUInt32(b, Convert.ToUInt32(url(k + 4) + (url(k + 5) << 8) + (url(k + 6) << 16) + (url(k + 7) << 24))) 87 c = AddUInt32(c, Convert.ToUInt32(url(k + 8) + (url(k + 9) << 8) + (url(k + 10) << 16) + (url(k + 11) << 24))) 88 m_mix = mix(a, b, c) 89 a = m_mix(0) 90 b = m_mix(1) 91 c = m_mix(2) 92 93 k += 12 94 len -= 12 95 End While 96 97 c += length 98 99 Select Case len ' all the case statements fall through 100 Case 11 101 c = AddUInt32(c, Convert.ToUInt32(url(k + 10) << 24)) 102 c = AddUInt32(c, Convert.ToUInt32(url(k + 9) << 16)) 103 c = AddUInt32(c, Convert.ToUInt32(url(k + 8) << 8)) 104 b = AddUInt32(b, Convert.ToUInt32(url(k + 7) << 24)) 105 b = AddUInt32(b, Convert.ToUInt32(url(k + 6) << 16)) 106 b = AddUInt32(b, Convert.ToUInt32(url(k + 5) << 8)) 107 b = AddUInt32(b, Convert.ToUInt32(url(k + 4))) 108 a = AddUInt32(a, Convert.ToUInt32(url(k + 3) << 24)) 109 a = AddUInt32(a, Convert.ToUInt32(url(k + 2) << 16)) 110 a = AddUInt32(a, Convert.ToUInt32(url(k + 1) << 8)) 111 a = AddUInt32(a, Convert.ToUInt32(url(k + 0))) 112 Case 10 113 c = AddUInt32(c, Convert.ToUInt32(url(k + 9) << 16)) 114 c = AddUInt32(c, Convert.ToUInt32(url(k + 8) << 8)) 115 b = AddUInt32(b, Convert.ToUInt32(url(k + 7) << 24)) 116 b = AddUInt32(b, Convert.ToUInt32(url(k + 6) << 16)) 117 b = AddUInt32(b, Convert.ToUInt32(url(k + 5) << 8)) 118 b = AddUInt32(b, Convert.ToUInt32(url(k + 4))) 119 a = AddUInt32(a, Convert.ToUInt32(url(k + 3) << 24)) 120 a = AddUInt32(a, Convert.ToUInt32(url(k + 2) << 16)) 121 a = AddUInt32(a, Convert.ToUInt32(url(k + 1) << 8)) 122 a = AddUInt32(a, Convert.ToUInt32(url(k + 0))) 123 Case 9 124 c = AddUInt32(c, Convert.ToUInt32(url(k + 8) << 8)) 125 b = AddUInt32(b, Convert.ToUInt32(url(k + 7) << 24)) 126 b = AddUInt32(b, Convert.ToUInt32(url(k + 6) << 16)) 127 b = AddUInt32(b, Convert.ToUInt32(url(k + 5) << 8)) 128 b = AddUInt32(b, Convert.ToUInt32(url(k + 4))) 129 a = AddUInt32(a, Convert.ToUInt32(url(k + 3) << 24)) 130 a = AddUInt32(a, Convert.ToUInt32(url(k + 2) << 16)) 131 a = AddUInt32(a, Convert.ToUInt32(url(k + 1) << 8)) 132 a = AddUInt32(a, Convert.ToUInt32(url(k + 0))) 133 ' the first byte of c is reserved for the length 134 Case 8 135 b = AddUInt32(b, Convert.ToUInt32(url(k + 7) << 24)) 136 b = AddUInt32(b, Convert.ToUInt32(url(k + 6) << 16)) 137 b = AddUInt32(b, Convert.ToUInt32(url(k + 5) << 8)) 138 b = AddUInt32(b, Convert.ToUInt32(url(k + 4))) 139 a = AddUInt32(a, Convert.ToUInt32(url(k + 3) << 24)) 140 a = AddUInt32(a, Convert.ToUInt32(url(k + 2) << 16)) 141 a = AddUInt32(a, Convert.ToUInt32(url(k + 1) << 8)) 142 a = AddUInt32(a, Convert.ToUInt32(url(k + 0))) 143 Case 7 144 b = AddUInt32(b, Convert.ToUInt32(url(k + 6) << 16)) 145 b = AddUInt32(b, Convert.ToUInt32(url(k + 5) << 8)) 146 b = AddUInt32(b, Convert.ToUInt32(url(k + 4))) 147 a = AddUInt32(a, Convert.ToUInt32(url(k + 3) << 24)) 148 a = AddUInt32(a, Convert.ToUInt32(url(k + 2) << 16)) 149 a = AddUInt32(a, Convert.ToUInt32(url(k + 1) << 8)) 150 a = AddUInt32(a, Convert.ToUInt32(url(k + 0))) 151 Case 6 152 b = AddUInt32(b, Convert.ToUInt32(url(k + 5) << 8)) 153 b = AddUInt32(b, Convert.ToUInt32(url(k + 4))) 154 a = AddUInt32(a, Convert.ToUInt32(url(k + 3) << 24)) 155 a = AddUInt32(a, Convert.ToUInt32(url(k + 2) << 16)) 156 a = AddUInt32(a, Convert.ToUInt32(url(k + 1) << 8)) 157 a = AddUInt32(a, Convert.ToUInt32(url(k + 0))) 158 Case 5 159 b = AddUInt32(b, Convert.ToUInt32(url(k + 4))) 160 a = AddUInt32(a, Convert.ToUInt32(url(k + 3) << 24)) 161 a = AddUInt32(a, Convert.ToUInt32(url(k + 2) << 16)) 162 a = AddUInt32(a, Convert.ToUInt32(url(k + 1) << 8)) 163 a = AddUInt32(a, Convert.ToUInt32(url(k + 0))) 164 165 Case 4 166 a = AddUInt32(a, Convert.ToUInt32(url(k + 3) << 24)) 167 a = AddUInt32(a, Convert.ToUInt32(url(k + 2) << 16)) 168 a = AddUInt32(a, Convert.ToUInt32(url(k + 1) << 8)) 169 a = AddUInt32(a, Convert.ToUInt32(url(k + 0))) 170 Case 3 171 a = AddUInt32(a, Convert.ToUInt32(url(k + 2) << 16)) 172 a = AddUInt32(a, Convert.ToUInt32(url(k + 1) << 8)) 173 a = AddUInt32(a, Convert.ToUInt32(url(k + 0))) 174 Case 2 175 a = AddUInt32(a, Convert.ToUInt32(url(k + 1) << 8)) 176 a = AddUInt32(a, Convert.ToUInt32(url(k + 0))) 177 Case 1 178 a = AddUInt32(a, Convert.ToUInt32(url(k + 0))) 179 ' case 0: nothing left to add 180 End Select 181 m_mix = mix(a, b, c) 182 '-------------------------------------------- report the result 183 Return m_mix(2) 184 End Function 185 186 Private Function GoogleCH()Function GoogleCH(ByVal url As String, ByVal length As UInt32) As UInt32 187 Dim m_urluint(url.Length) As UInt32 188 Dim i As Integer 189 For i = 0 To url.Length - 1 190 m_urluint(i) = Convert.ToUInt32(url(i)) 191 Next 192 Return GoogleCH(m_urluint, length, GOOGLE_MAGIC) 193 End Function 194 195 Private Function GoogleCH()Function GoogleCH(ByVal sURL As String) As UInt32 196 Return GoogleCH(sURL, 0) 197 End Function 198 199 Private Function GoogleCH()Function GoogleCH(ByVal url() As UInt32, ByVal length As UInt32) As UInt32 200 Return GoogleCH(url, length, GOOGLE_MAGIC) 201 End Function 202 203 Private Function c32to8bit()Function c32to8bit(ByVal arr32() As UInt32) As UInt32() 204 Dim arr8((arr32.GetLength(0) - 1) * 4 + 3) As UInt32 205 Dim i As Integer 206 For i = 0 To arr32.GetLength(0) - 1 207 Dim bitOrder As Integer 208 For bitOrder = i * 4 To i * 4 + 3 209 arr8(bitOrder) = arr32(i) And 255 210 arr32(i) = zeroFill(arr32(i), 8) 211 Next 212 Next 213 Return arr8 214 End Function 215 216 Private Function AddUInt32()Function AddUInt32(ByVal a As UInt32, ByVal b As UInt32) As UInt32 217 Dim resultValue As UInt32 218 219 Dim a64 As UInt64 = Convert.ToUInt64(a) 220 Dim b64 As UInt64 = Convert.ToUInt64(b) 221 Dim result64 As Int64 = a64 + b64 222 223 Dim sStr As String = Convert.ToString(result64, 2) 224 Dim sResult As String 225 If sStr.Length > 32 Then 226 sResult = sStr.Substring(sStr.Length - 32) 227 Else 228 sResult = sStr 229 End If 230 231 resultValue = Convert.ToUInt32(sResult, 2) 232 Return resultValue 233 End Function 234 235 Private Function ReduceUInt32()Function ReduceUInt32(ByVal a As UInt32, ByVal b As UInt32) As UInt32 236 Dim resultValue As UInt32 237 238 Dim aTemp As Int64 = a 239 Dim bTemp As Int64 = b 240 241 Dim resultTemp As Int64 = aTemp - bTemp 242 243 Dim resultBinStr As String = Convert.ToString(resultTemp, 2) 244 Dim sResult As String 245 If resultBinStr.Length > 32 Then 246 sResult = resultBinStr.Substring(resultBinStr.Length - 32) 247 Else 248 sResult = resultBinStr 249 End If 250 251 resultValue = Convert.ToUInt32(sResult, 2) 252 Return resultValue 253 End Function 254 255 Private Function GetUInt32Value()Function GetUInt32Value(ByVal a As Int64) As UInt32 256 Dim tempValue As Int64 = a 257 258 Dim resultBinStr As String = Convert.ToString(tempValue, 2) 259 Dim sResult As String 260 If resultBinStr.Length > 32 Then 261 sResult = resultBinStr.Substring(resultBinStr.Length - 32) 262 Else 263 sResult = resultBinStr 264 End If 265 tempValue = Convert.ToUInt32(sResult, 2) 266 Return tempValue 267 End Function 268 269 Public Function Mul()Function Mul(ByVal x As UInt32, ByVal y As UInt32) 270 Dim r As UInt32 = 0 271 Dim i As Int32 = 0 272 273 For i = 32 To 0 Step -1 274 r = r << 1 275 If x >> i And 1 Then 276 Dim r64 As Int64 = r 277 Dim y64 As Int64 = y 278 Dim tempResult As Int64 = r64 + y64 279 280 r = GetUInt32Value(tempResult) 281 End If 282 Next 283 284 Return r 285 End Function 286 287 Public Function PowerValue()Function PowerValue(ByVal a As UInt32, ByVal b As UInt32) 288 Dim resultValue As UInt32 = a 289 290 Dim i As Integer 291 For i = 1 To b - 1 292 resultValue = Mul(resultValue, a) 293 Next 294 295 Return resultValue 296 End Function 297 298 Public Function DEC_to_BIN()Function DEC_to_BIN(ByVal Dec As Int64) As String 299 DEC_to_BIN = "" 300 If Dec > 0 Then 301 Do While Dec > 0 302 DEC_to_BIN = Math.Abs(Dec Mod 2) & DEC_to_BIN 303 Dec = Dec \ 2 304 Loop 305 Else 306 307 End If 308 End Function 309 310 Public Function BIN_to_DEC()Function BIN_to_DEC(ByVal Bin As String) As UInt32 311 Dim i As UInt32 312 For i = 1 To Len(Bin) 313 BIN_to_DEC = BIN_to_DEC * 2 + Val(Mid(Bin, i, 1)) 314 Next i 315 End Function 316 317 'new,ToolBar edition>>=2.0.114 318 Public Function CalculateChecksum()Function CalculateChecksum(ByVal sURL As String) As String 319 Dim ch As UInt32 = GoogleCH("info:" + sURL) 320 321 ch = (((ch \ 7) << 2) Or ((Convert.ToUInt32(ch Mod 13)) And 7)) 322 323 Dim prbuf(20) As UInt32 324 prbuf(0) = ch 325 Dim i As Integer 326 For i = 1 To 20 - 1 327 prbuf(i) = prbuf(i - 1) - 9 328 Next 329 ch = GoogleCH(c32to8bit(prbuf), 80) 330 331 Return String.Format("6{0}", ch) 332 End Function 333 334 'old,ToolBar edition<2.0.114 335 Public Function CalculateChecksumOld()Function CalculateChecksumOld(ByVal sURL As String) As String 336 337 Dim ch As UInt32 = GoogleCH("info:" + sURL) 338 339 Dim CalculateChecksum As String = "6" + Convert.ToString((ch)) 340 Return CalculateChecksum 341 End Function 342End Class 343