Страница: 1 |
Вопрос: CRC32 | Добавлено: 27.08.09 14:52 |
Автор вопроса: ![]() |
вот, решил поделиться с вами, такой фигней
преимущества в том, что не требует ни каких внешний библиотек и полностью на 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 |
Ответы | Всего ответов: 2 |
Номер ответа: 1 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Лидер форума ICQ: 216865379 Вопросов: 106 Ответов: 9979 |
Web-сайт: Профиль | Цитата | #1 | Добавлено: 27.08.09 16:41 |
Double-то зачем? |
Номер ответа: 2 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ICQ: 216390557 Вопросов: 25 Ответов: 71 |
Web-сайт: Профиль | Цитата | #2 | Добавлено: 27.08.09 18:20 |
Эту радость я не написал, а нашел в нете. Красиво, просто, лаконично. Нашел в исходнике программы от Siemens Nederland N.V.
|
Страница: 1 |
|