Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: CRC32 Добавлено: 27.08.09 14:52  

Автор вопроса:  Oloth Teken'duis
вот, решил поделиться с вами, такой фигней
преимущества в том, что не требует ни каких внешний библиотек и полностью на 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
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #1
Добавлено: 27.08.09 16:41
Double-то зачем?

Ответить

Номер ответа: 2
Автор ответа:
 Boconon



ICQ: 216390557 

Вопросов: 25
Ответов: 71
 Web-сайт: microsoft.com
 Профиль | | #2
Добавлено: 27.08.09 18:20
Эту радость я не написал, а нашел в нете. Красиво, просто, лаконично. Нашел в исходнике программы от Siemens Nederland N.V.

  1. Option Explicit
  2.  
  3. Dim CrcTableInit As Boolean
  4. Dim CRCTable(0 To 255) As Long
  5.  
  6. Public Function calcCRC32(ByteArray() As Byte) As Long
  7.     Dim i As Long
  8.     Dim crc As Long
  9.     If CrcTableInit = False Then Call Init_CRCTable
  10.     crc = -1
  11.     For i = 0 To UBound(ByteArray) - 1
  12.         crc = (((crc And &HFFFFFF00) \ &H100) And &HFFFFFF) Xor (CRCTable((crc And &HFF) Xor ByteArray(i)))
  13.     Next i
  14.     crc = crc Xor &HFFFFFFFF
  15.     calcCRC32 = crc
  16. End Function
  17.  
  18. Private Sub Init_CRCTable()
  19.     Dim i As Long
  20.     Dim j As Long
  21.     Dim Limit As Long
  22.     Dim crc As Long
  23.     Limit = &HEDB88320
  24.     For i = 0 To 255
  25.         crc = i
  26.         For j = 0 To 7
  27.             If crc And 1 Then
  28.               crc = (((crc And &HFFFFFFFE) \ 2) And &H7FFFFFFF) Xor Limit
  29.             Else
  30.               crc = ((crc And &HFFFFFFFE) \ 2) And &H7FFFFFFF
  31.             End If
  32.         Next j
  33.         CRCTable(i) = crc
  34.     Next i
  35.     CrcTableInit = True
  36. End Sub

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам