вот, решил поделиться с вами, такой фигней
преимущества в том, что не требует ни каких внешний библиотек и полностью на VB6.
я понимаю, что тема избита... 8)
а может кто то и поможет это оптимизировать.
проблемы с которыми я столкнулся когда это делал:
1. типа данных, тут всё ужасно, операции AND, XOR не работают с переменными типа DOUBLE, ошибка переполнения... из за этого пришлось извращаться и делать 2 отдельные функции под них (там всё просто число 2ичное разбивается на 2 части и проводятся логические операции ) а потом соединяются )
2. 16ричные числа аля &HFFFFFFFF представлены в виде LONG, то есть при присвоении к DOUBLE присваивается отрицательное значение числа типа LONG
Private Table(255) As Double
Private Sub Class_Initialize()
Table(0) = 0#
Table(1) = 1996959894#
Table(2) = 3993919788#
Table(3) = 2567524794#
Table(4) = 124634137#
Table(5) = 1886057615#
Table(6) = 3915621685#
Table(7) = 2657392035#
Table(8) = 249268274#
Table(9) = 2044508324#
Table(10) = 3772115230#
Table(11) = 2547177864#
Table(12) = 162941995#
Table(13) = 2125561021#
Table(14) = 3887607047#
Table(15) = 2428444049#
Table(16) = 498536548#
Table(17) = 1789927666#
Table(18) = 4089016648#
Table(19) = 2227061214#
Table(20) = 450548861#
Table(21) = 1843258603#
Table(22) = 4107580753#
Table(23) = 2211677639#
Table(24) = 325883990#
Table(25) = 1684777152#
Table(26) = 4251122042#
Table(27) = 2321926636#
Table(28) = 335633487#
Table(29) = 1661365465#
Table(30) = 4195302755#
Table(31) = 2366115317#
Table(32) = 997073096#
Table(33) = 1281953886#
Table(34) = 3579855332#
Table(35) = 2724688242#
Table(36) = 1006888145#
Table(37) = 1258607687#
Table(38) = 3524101629#
Table(39) = 2768942443#
Table(40) = 901097722#
Table(41) = 1119000684#
Table(42) = 3686517206#
Table(43) = 2898065728#
Table(44) = 853044451#
Table(45) = 1172266101#
Table(46) = 3705015759#
Table(47) = 2882616665#
Table(48) = 651767980#
Table(49) = 1373503546#
Table(50) = 3369554304#
Table(51) = 3218104598#
Table(52) = 565507253#
Table(53) = 1454621731#
Table(54) = 3485111705#
Table(55) = 3099436303#
Table(56) = 671266974#
Table(57) = 1594198024#
Table(58) = 3322730930#
Table(59) = 2970347812#
Table(60) = 795835527#
Table(61) = 1483230225#
Table(62) = 3244367275#
Table(63) = 3060149565#
Table(64) = 1994146192#
Table(65) = 31158534#
Table(66) = 2563907772#
Table(67) = 4023717930#
Table(68) = 1907459465#
Table(69) = 112637215#
Table(70) = 2680153253#
Table(71) = 3904427059#
Table(72) = 2013776290#
Table(73) = 251722036#
Table(74) = 2517215374#
Table(75) = 3775830040#
Table(76) = 2137656763#
Table(77) = 141376813#
Table(78) = 2439277719#
Table(79) = 3865271297#
Table(80) = 1802195444#
Table(81) = 476864866#
Table(82) = 2238001368#
Table(83) = 4066508878#
Table(84) = 1812370925#
Table(85) = 453092731#
Table(86) = 2181625025#
Table(87) = 4111451223#
Table(88) = 1706088902#
Table(89) = 314042704#
Table(90) = 2344532202#
Table(91) = 4240017532#
Table(92) = 1658658271#
Table(93) = 366619977#
Table(94) = 2362670323#
Table(95) = 4224994405#
Table(96) = 1303535960#
Table(97) = 984961486#
Table(98) = 2747007092#
Table(99) = 3569037538#
Table(100) = 1256170817#
Table(101) = 1037604311#
Table(102) = 2765210733#
Table(103) = 3554079995#
Table(104) = 1131014506#
Table(105) = 879679996#
Table(106) = 2909243462#
Table(107) = 3663771856#
Table(108) = 1141124467#
Table(109) = 855842277#
Table(110) = 2852801631#
Table(111) = 3708648649#
Table(112) = 1342533948#
Table(113) = 654459306#
Table(114) = 3188396048#
Table(115) = 3373015174#
Table(116) = 1466479909#
Table(117) = 544179635#
Table(118) = 3110523913#
Table(119) = 3462522015#
Table(120) = 1591671054#
Table(121) = 702138776#
Table(122) = 2966460450#
Table(123) = 3352799412#
Table(124) = 1504918807#
Table(125) = 783551873#
Table(126) = 3082640443#
Table(127) = 3233442989#
Table(128) = 3988292384#
Table(129) = 2596254646#
Table(130) = 62317068#
Table(131) = 1957810842#
Table(132) = 3939845945#
Table(133) = 2647816111#
Table(134) = 81470997#
Table(135) = 1943803523#
Table(136) = 3814918930#
Table(137) = 2489596804#
Table(138) = 225274430#
Table(139) = 2053790376#
Table(140) = 3826175755#
Table(141) = 2466906013#
Table(142) = 167816743#
Table(143) = 2097651377#
Table(144) = 4027552580#
Table(145) = 2265490386#
Table(146) = 503444072#
Table(147) = 1762050814#
Table(148) = 4150417245#
Table(149) = 2154129355#
Table(150) = 426522225#
Table(151) = 1852507879#
Table(152) = 4275313526#
Table(153) = 2312317920#
Table(154) = 282753626#
Table(155) = 1742555852#
Table(156) = 4189708143#
Table(157) = 2394877945#
Table(158) = 397917763#
Table(159) = 1622183637#
Table(160) = 3604390888#
Table(161) = 2714866558#
Table(162) = 953729732#
Table(163) = 1340076626#
Table(164) = 3518719985#
Table(165) = 2797360999#
Table(166) = 1068828381#
Table(167) = 1219638859#
Table(168) = 3624741850#
Table(169) = 2936675148#
Table(170) = 906185462#
Table(171) = 1090812512#
Table(172) = 3747672003#
Table(173) = 2825379669#
Table(174) = 829329135#
Table(175) = 1181335161#
Table(176) = 3412177804#
Table(177) = 3160834842#
Table(178) = 628085408#
Table(179) = 1382605366#
Table(180) = 3423369109#
Table(181) = 3138078467#
Table(182) = 570562233#
Table(183) = 1426400815#
Table(184) = 3317316542#
Table(185) = 2998733608#
Table(186) = 733239954#
Table(187) = 1555261956#
Table(188) = 3268935591#
Table(189) = 3050360625#
Table(190) = 752459403#
Table(191) = 1541320221#
Table(192) = 2607071920#
Table(193) = 3965973030#
Table(194) = 1969922972#
Table(195) = 40735498#
Table(196) = 2617837225#
Table(197) = 3943577151#
Table(198) = 1913087877#
Table(199) = 83908371#
Table(200) = 2512341634#
Table(201) = 3803740692#
Table(202) = 2075208622#
Table(203) = 213261112#
Table(204) = 2463272603#
Table(205) = 3855990285#
Table(206) = 2094854071#
Table(207) = 198958881#
Table(208) = 2262029012#
Table(209) = 4057260610#
Table(210) = 1759359992#
Table(211) = 534414190#
Table(212) = 2176718541#
Table(213) = 4139329115#
Table(214) = 1873836001#
Table(215) = 414664567#
Table(216) = 2282248934#
Table(217) = 4279200368#
Table(218) = 1711684554#
Table(219) = 285281116#
Table(220) = 2405801727#
Table(221) = 4167216745#
Table(222) = 1634467795#
Table(223) = 376229701#
Table(224) = 2685067896#
Table(225) = 3608007406#
Table(226) = 1308918612#
Table(227) = 956543938#
Table(228) = 2808555105#
Table(229) = 3495958263#
Table(230) = 1231636301#
Table(231) = 1047427035#
Table(232) = 2932959818#
Table(233) = 3654703836#
Table(234) = 1088359270#
Table(235) = 936918000#
Table(236) = 2847714899#
Table(237) = 3736837829#
Table(238) = 1202900863#
Table(239) = 817233897#
Table(240) = 3183342108#
Table(241) = 3401237130#
Table(242) = 1404277552#
Table(243) = 615818150#
Table(244) = 3134207493#
Table(245) = 3453421203#
Table(246) = 1423857449#
Table(247) = 601450431#
Table(248) = 3009837614#
Table(249) = 3294710456#
Table(250) = 1567103746#
Table(251) = 711928724#
Table(252) = 3020668471#
Table(253) = 3272380065#
Table(254) = 1510334235#
Table(255) = 755167117#
End Sub
Public Function GetCRC32_String(inString) As Double
Dim byte1 As Double, temp1 As Double, temp2 As Double, temp3 As Double
Dim result As Double
Dim crc As Double: crc = 4294967295#
For i = 1 To Len(inString)
byte1 = Asc(Mid(inString, i, 1))
temp1 = Int(crc / 256)
temp2 = DoubleAnd(DoubleXor(crc, byte1), 255)
crc = DoubleXor(temp1, Table(temp2))
Next
GetCRC32_String = DoubleXor(crc, 4294967295#)
End Function
Private Function DoubleXor(inValue1 As Double, inValue2 As Double) As Double
' DoubleXor = ((Int((inValue1 / (2 ^ 16)))) Xor Int((inValue2 / (2 ^ 16)))) * (2 ^ 16) + ((inValue1 - (Int((inValue1 / (2 ^ 16))) * (2 ^ 16))) Xor (inValue2 - (Int((inValue2 / (2 ^ 16))) * (2 ^ 16))))
inValue11 = Int((inValue1 / (2 ^ 16))) '- 1 число
inValue12 = inValue1 - (Int((inValue1 / (2 ^ 16))) * (2 ^ 16)) '- 2 число
inValue21 = Int((inValue2 / (2 ^ 16))) '- 1 число
inValue22 = inValue2 - (Int((inValue2 / (2 ^ 16))) * (2 ^ 16)) '- 2 число
tempValue1 = inValue11 Xor inValue21
tempValue2 = inValue12 Xor inValue22
DoubleXor = tempValue1 * (2 ^ 16) + tempValue2
End Function
Private Function DoubleAnd(inValue1 As Double, inValue2 As Double) As Double
inValue11 = Int((inValue1 / (2 ^ 16))) '- 1 число
inValue12 = inValue1 - (Int((inValue1 / (2 ^ 16))) * (2 ^ 16)) '- 2 число
inValue21 = Int((inValue2 / (2 ^ 16))) '- 1 число
inValue22 = inValue2 - (Int((inValue2 / (2 ^ 16))) * (2 ^ 16)) '- 2 число
tempValue1 = inValue11 And inValue21
tempValue2 = inValue12 And inValue22
DoubleAnd = tempValue1 * (2 ^ 16) + tempValue2
End Function
Public Function GetCRC32_File(file As String) As Double
Dim tempfile As Integer: tempfile = FreeFile
Open file For Binary Access Read As tempfile
Dim data As String
data = String(LOF(tempfile), 0)
Get tempfile, , data
GetCRC32_File = GetCRC32_String(data)
End Function
Ответить
|