CRC32: Дополнить файл для получения контрольной суммы FFFFFFFF - VB

Узнай цену своей работы

Формулировка задачи:

Привет! Имеется произвольный бинарный файл. Цель: дополнить его как можно меньшим кол-вом байт, чтобы его КС по CRC32 стала = FFFFFFFF. Можете для меня такое сочинить? P.S. Долгое время пользуюсь модулем подсчета CRC32 от Catstail, который меня не подводил. Настало время чего то более сложного. Т.к. не математик, сам такого боюсь не сделаю.
Листинг программы
  1. ''
  2. '' by CatsTail
  3. ''
  4. Option Explicit
  5. '::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  6. ':::::::::::::::: Расчет CRC-32 ::::::::::::::::
  7. '::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  8. Private CRC_32_Tab(0 To 255) As Long
  9. Private Sub Class_Initialize()
  10. CRCinit
  11. End Sub
  12. ':::::::::::::::: Проинициализировать массив коэффициентов ::::::::::::::::
  13. Private Sub CRCinit()
  14. CRC_32_Tab(0) = &H0
  15. CRC_32_Tab(1) = &H77073096
  16. CRC_32_Tab(2) = &HEE0E612C
  17. CRC_32_Tab(3) = &H990951BA
  18. CRC_32_Tab(4) = &H76DC419
  19. CRC_32_Tab(5) = &H706AF48F
  20. CRC_32_Tab(6) = &HE963A535
  21. CRC_32_Tab(7) = &H9E6495A3
  22. CRC_32_Tab(8) = &HEDB8832
  23. CRC_32_Tab(9) = &H79DCB8A4
  24. CRC_32_Tab(10) = &HE0D5E91E
  25. CRC_32_Tab(11) = &H97D2D988
  26. CRC_32_Tab(12) = &H9B64C2B
  27. CRC_32_Tab(13) = &H7EB17CBD
  28. CRC_32_Tab(14) = &HE7B82D07
  29. CRC_32_Tab(15) = &H90BF1D91
  30. CRC_32_Tab(16) = &H1DB71064
  31. CRC_32_Tab(17) = &H6AB020F2
  32. CRC_32_Tab(18) = &HF3B97148
  33. CRC_32_Tab(19) = &H84BE41DE
  34. CRC_32_Tab(20) = &H1ADAD47D
  35. CRC_32_Tab(21) = &H6DDDE4EB
  36. CRC_32_Tab(22) = &HF4D4B551
  37. CRC_32_Tab(23) = &H83D385C7
  38. CRC_32_Tab(24) = &H136C9856
  39. CRC_32_Tab(25) = &H646BA8C0
  40. CRC_32_Tab(26) = &HFD62F97A
  41. CRC_32_Tab(27) = &H8A65C9EC
  42. CRC_32_Tab(28) = &H14015C4F
  43. CRC_32_Tab(29) = &H63066CD9
  44. CRC_32_Tab(30) = &HFA0F3D63
  45. CRC_32_Tab(31) = &H8D080DF5
  46. CRC_32_Tab(32) = &H3B6E20C8
  47. CRC_32_Tab(33) = &H4C69105E
  48. CRC_32_Tab(34) = &HD56041E4
  49. CRC_32_Tab(35) = &HA2677172
  50. CRC_32_Tab(36) = &H3C03E4D1
  51. CRC_32_Tab(37) = &H4B04D447
  52. CRC_32_Tab(38) = &HD20D85FD
  53. CRC_32_Tab(39) = &HA50AB56B
  54. CRC_32_Tab(40) = &H35B5A8FA
  55. CRC_32_Tab(41) = &H42B2986C
  56. CRC_32_Tab(42) = &HDBBBC9D6
  57. CRC_32_Tab(43) = &HACBCF940
  58. CRC_32_Tab(44) = &H32D86CE3
  59. CRC_32_Tab(45) = &H45DF5C75
  60. CRC_32_Tab(46) = &HDCD60DCF
  61. CRC_32_Tab(47) = &HABD13D59
  62. CRC_32_Tab(48) = &H26D930AC
  63. CRC_32_Tab(49) = &H51DE003A
  64. CRC_32_Tab(50) = &HC8D75180
  65. CRC_32_Tab(51) = &HBFD06116
  66. CRC_32_Tab(52) = &H21B4F4B5
  67. CRC_32_Tab(53) = &H56B3C423
  68. CRC_32_Tab(54) = &HCFBA9599
  69. CRC_32_Tab(55) = &HB8BDA50F
  70. CRC_32_Tab(56) = &H2802B89E
  71. CRC_32_Tab(57) = &H5F058808
  72. CRC_32_Tab(58) = &HC60CD9B2
  73. CRC_32_Tab(59) = &HB10BE924
  74. CRC_32_Tab(60) = &H2F6F7C87
  75. CRC_32_Tab(61) = &H58684C11
  76. CRC_32_Tab(62) = &HC1611DAB
  77. CRC_32_Tab(63) = &HB6662D3D
  78. CRC_32_Tab(64) = &H76DC4190
  79. CRC_32_Tab(65) = &H1DB7106
  80. CRC_32_Tab(66) = &H98D220BC
  81. CRC_32_Tab(67) = &HEFD5102A
  82. CRC_32_Tab(68) = &H71B18589
  83. CRC_32_Tab(69) = &H6B6B51F
  84. CRC_32_Tab(70) = &H9FBFE4A5
  85. CRC_32_Tab(71) = &HE8B8D433
  86. CRC_32_Tab(72) = &H7807C9A2
  87. CRC_32_Tab(73) = &HF00F934
  88. CRC_32_Tab(74) = &H9609A88E
  89. CRC_32_Tab(75) = &HE10E9818
  90. CRC_32_Tab(76) = &H7F6A0DBB
  91. CRC_32_Tab(77) = &H86D3D2D
  92. CRC_32_Tab(78) = &H91646C97
  93. CRC_32_Tab(79) = &HE6635C01
  94. CRC_32_Tab(80) = &H6B6B51F4
  95. CRC_32_Tab(81) = &H1C6C6162
  96. CRC_32_Tab(82) = &H856530D8
  97. CRC_32_Tab(83) = &HF262004E
  98. CRC_32_Tab(84) = &H6C0695ED
  99. CRC_32_Tab(85) = &H1B01A57B
  100. CRC_32_Tab(86) = &H8208F4C1
  101. CRC_32_Tab(87) = &HF50FC457
  102. CRC_32_Tab(88) = &H65B0D9C6
  103. CRC_32_Tab(89) = &H12B7E950
  104. CRC_32_Tab(90) = &H8BBEB8EA
  105. CRC_32_Tab(91) = &HFCB9887C
  106. CRC_32_Tab(92) = &H62DD1DDF
  107. CRC_32_Tab(93) = &H15DA2D49
  108. CRC_32_Tab(94) = &H8CD37CF3
  109. CRC_32_Tab(95) = &HFBD44C65
  110. CRC_32_Tab(96) = &H4DB26158
  111. CRC_32_Tab(97) = &H3AB551CE
  112. CRC_32_Tab(98) = &HA3BC0074
  113. CRC_32_Tab(99) = &HD4BB30E2
  114. CRC_32_Tab(100) = &H4ADFA541
  115. CRC_32_Tab(101) = &H3DD895D7
  116. CRC_32_Tab(102) = &HA4D1C46D
  117. CRC_32_Tab(103) = &HD3D6F4FB
  118. CRC_32_Tab(104) = &H4369E96A
  119. CRC_32_Tab(105) = &H346ED9FC
  120. CRC_32_Tab(106) = &HAD678846
  121. CRC_32_Tab(107) = &HDA60B8D0
  122. CRC_32_Tab(108) = &H44042D73
  123. CRC_32_Tab(109) = &H33031DE5
  124. CRC_32_Tab(110) = &HAA0A4C5F
  125. CRC_32_Tab(111) = &HDD0D7CC9
  126. CRC_32_Tab(112) = &H5005713C
  127. CRC_32_Tab(113) = &H270241AA
  128. CRC_32_Tab(114) = &HBE0B1010
  129. CRC_32_Tab(115) = &HC90C2086
  130. CRC_32_Tab(116) = &H5768B525
  131. CRC_32_Tab(117) = &H206F85B3
  132. CRC_32_Tab(118) = &HB966D409
  133. CRC_32_Tab(119) = &HCE61E49F
  134. CRC_32_Tab(120) = &H5EDEF90E
  135. CRC_32_Tab(121) = &H29D9C998
  136. CRC_32_Tab(122) = &HB0D09822
  137. CRC_32_Tab(123) = &HC7D7A8B4
  138. CRC_32_Tab(124) = &H59B33D17
  139. CRC_32_Tab(125) = &H2EB40D81
  140. CRC_32_Tab(126) = &HB7BD5C3B
  141. CRC_32_Tab(127) = &HC0BA6CAD
  142. CRC_32_Tab(128) = &HEDB88320
  143. CRC_32_Tab(129) = &H9ABFB3B6
  144. CRC_32_Tab(130) = &H3B6E20C
  145. CRC_32_Tab(131) = &H74B1D29A
  146. CRC_32_Tab(132) = &HEAD54739
  147. CRC_32_Tab(133) = &H9DD277AF
  148. CRC_32_Tab(134) = &H4DB2615
  149. CRC_32_Tab(135) = &H73DC1683
  150. CRC_32_Tab(136) = &HE3630B12
  151. CRC_32_Tab(137) = &H94643B84
  152. CRC_32_Tab(138) = &HD6D6A3E
  153. CRC_32_Tab(139) = &H7A6A5AA8
  154. CRC_32_Tab(140) = &HE40ECF0B
  155. CRC_32_Tab(141) = &H9309FF9D
  156. CRC_32_Tab(142) = &HA00AE27
  157. CRC_32_Tab(143) = &H7D079EB1
  158. CRC_32_Tab(144) = &HF00F9344
  159. CRC_32_Tab(145) = &H8708A3D2
  160. CRC_32_Tab(146) = &H1E01F268
  161. CRC_32_Tab(147) = &H6906C2FE
  162. CRC_32_Tab(148) = &HF762575D
  163. CRC_32_Tab(149) = &H806567CB
  164. CRC_32_Tab(150) = &H196C3671
  165. CRC_32_Tab(151) = &H6E6B06E7
  166. CRC_32_Tab(152) = &HFED41B76
  167. CRC_32_Tab(153) = &H89D32BE0
  168. CRC_32_Tab(154) = &H10DA7A5A
  169. CRC_32_Tab(155) = &H67DD4ACC
  170. CRC_32_Tab(156) = &HF9B9DF6F
  171. CRC_32_Tab(157) = &H8EBEEFF9
  172. CRC_32_Tab(158) = &H17B7BE43
  173. CRC_32_Tab(159) = &H60B08ED5
  174. CRC_32_Tab(160) = &HD6D6A3E8
  175. CRC_32_Tab(161) = &HA1D1937E
  176. CRC_32_Tab(162) = &H38D8C2C4
  177. CRC_32_Tab(163) = &H4FDFF252
  178. CRC_32_Tab(164) = &HD1BB67F1
  179. CRC_32_Tab(165) = &HA6BC5767
  180. CRC_32_Tab(166) = &H3FB506DD
  181. CRC_32_Tab(167) = &H48B2364B
  182. CRC_32_Tab(168) = &HD80D2BDA
  183. CRC_32_Tab(169) = &HAF0A1B4C
  184. CRC_32_Tab(170) = &H36034AF6
  185. CRC_32_Tab(171) = &H41047A60
  186. CRC_32_Tab(172) = &HDF60EFC3
  187. CRC_32_Tab(173) = &HA867DF55
  188. CRC_32_Tab(174) = &H316E8EEF
  189. CRC_32_Tab(175) = &H4669BE79
  190. CRC_32_Tab(176) = &HCB61B38C
  191. CRC_32_Tab(177) = &HBC66831A
  192. CRC_32_Tab(178) = &H256FD2A0
  193. CRC_32_Tab(179) = &H5268E236
  194. CRC_32_Tab(180) = &HCC0C7795
  195. CRC_32_Tab(181) = &HBB0B4703
  196. CRC_32_Tab(182) = &H220216B9
  197. CRC_32_Tab(183) = &H5505262F
  198. CRC_32_Tab(184) = &HC5BA3BBE
  199. CRC_32_Tab(185) = &HB2BD0B28
  200. CRC_32_Tab(186) = &H2BB45A92
  201. CRC_32_Tab(187) = &H5CB36A04
  202. CRC_32_Tab(188) = &HC2D7FFA7
  203. CRC_32_Tab(189) = &HB5D0CF31
  204. CRC_32_Tab(190) = &H2CD99E8B
  205. CRC_32_Tab(191) = &H5BDEAE1D
  206. CRC_32_Tab(192) = &H9B64C2B0
  207. CRC_32_Tab(193) = &HEC63F226
  208. CRC_32_Tab(194) = &H756AA39C
  209. CRC_32_Tab(195) = &H26D930A
  210. CRC_32_Tab(196) = &H9C0906A9
  211. CRC_32_Tab(197) = &HEB0E363F
  212. CRC_32_Tab(198) = &H72076785
  213. CRC_32_Tab(199) = &H5005713
  214. CRC_32_Tab(200) = &H95BF4A82
  215. CRC_32_Tab(201) = &HE2B87A14
  216. CRC_32_Tab(202) = &H7BB12BAE
  217. CRC_32_Tab(203) = &HCB61B38
  218. CRC_32_Tab(204) = &H92D28E9B
  219. CRC_32_Tab(205) = &HE5D5BE0D
  220. CRC_32_Tab(206) = &H7CDCEFB7
  221. CRC_32_Tab(207) = &HBDBDF21
  222. CRC_32_Tab(208) = &H86D3D2D4
  223. CRC_32_Tab(209) = &HF1D4E242
  224. CRC_32_Tab(210) = &H68DDB3F8
  225. CRC_32_Tab(211) = &H1FDA836E
  226. CRC_32_Tab(212) = &H81BE16CD
  227. CRC_32_Tab(213) = &HF6B9265B
  228. CRC_32_Tab(214) = &H6FB077E1
  229. CRC_32_Tab(215) = &H18B74777
  230. CRC_32_Tab(216) = &H88085AE6
  231. CRC_32_Tab(217) = &HFF0F6A70
  232. CRC_32_Tab(218) = &H66063BCA
  233. CRC_32_Tab(219) = &H11010B5C
  234. CRC_32_Tab(220) = &H8F659EFF
  235. CRC_32_Tab(221) = &HF862AE69
  236. CRC_32_Tab(222) = &H616BFFD3
  237. CRC_32_Tab(223) = &H166CCF45
  238. CRC_32_Tab(224) = &HA00AE278
  239. CRC_32_Tab(225) = &HD70DD2EE
  240. CRC_32_Tab(226) = &H4E048354
  241. CRC_32_Tab(227) = &H3903B3C2
  242. CRC_32_Tab(228) = &HA7672661
  243. CRC_32_Tab(229) = &HD06016F7
  244. CRC_32_Tab(230) = &H4969474D
  245. CRC_32_Tab(231) = &H3E6E77DB
  246. CRC_32_Tab(232) = &HAED16A4A
  247. CRC_32_Tab(233) = &HD9D65ADC
  248. CRC_32_Tab(234) = &H40DF0B66
  249. CRC_32_Tab(235) = &H37D83BF0
  250. CRC_32_Tab(236) = &HA9BCAE53
  251. CRC_32_Tab(237) = &HDEBB9EC5
  252. CRC_32_Tab(238) = &H47B2CF7F
  253. CRC_32_Tab(239) = &H30B5FFE9
  254. CRC_32_Tab(240) = &HBDBDF21C
  255. CRC_32_Tab(241) = &HCABAC28A
  256. CRC_32_Tab(242) = &H53B39330
  257. CRC_32_Tab(243) = &H24B4A3A6
  258. CRC_32_Tab(244) = &HBAD03605
  259. CRC_32_Tab(245) = &HCDD70693
  260. CRC_32_Tab(246) = &H54DE5729
  261. CRC_32_Tab(247) = &H23D967BF
  262. CRC_32_Tab(248) = &HB3667A2E
  263. CRC_32_Tab(249) = &HC4614AB8
  264. CRC_32_Tab(250) = &H5D681B02
  265. CRC_32_Tab(251) = &H2A6F2B94
  266. CRC_32_Tab(252) = &HB40BBE37
  267. CRC_32_Tab(253) = &HC30C8EA1
  268. CRC_32_Tab(254) = &H5A05DF1B
  269. CRC_32_Tab(255) = &H2D02EF8D
  270. End Sub
  271. '::::::::::: Правый логический сдвиг длинного целого :::::::::::::
  272. Function Shr(n As Long, m As Long) As Long
  273. Dim Q As Long
  274. If (m > 31&) Then
  275. Shr = 0
  276. Exit Function
  277. End If
  278. If (n >= 0) Then
  279. Shr = n \ (2& ^ m)
  280. Else
  281. Q = n And &H7FFFFFFF
  282. Q = Q \ (2& ^ m)
  283. Shr = Q Or (2& ^ (31& - m))
  284. End If
  285. End Function
  286. '::::::::::::::: Вычислить CRC-код строки ::::::::::::::::::::
  287. Public Function CalcCRC(Stri As String) As String '// Dragokas - добавил перевод в Hex
  288. Dim CRC As Long
  289. Dim i As Long
  290. Dim m As Long
  291. Dim n As Long
  292. CRC = &HFFFFFFFF
  293. For i = 1& To Len(Stri)
  294. m = Asc(Mid$(Stri, i&, 1&))
  295. n = (CRC Xor m&) And &HFF&
  296. CRC = CRC_32_Tab(n&) Xor (Shr(CRC, 8&) And &HFFFFFF)
  297. Next i
  298. CalcCRC = CStr(Hex(-(CRC + 1&)))
  299. If Len(CalcCRC) < 8& Then
  300. CalcCRC = Right$("0000000" & CalcCRC, 8&)
  301. End If
  302. End Function
  303. '::::::::::::::: Вычислить CRC-код файла ::::::::::::::::::::
  304. Public Function CalcFileCRC(FileName As String) As String '// Added by Dragokas
  305. On Error Resume Next
  306. Dim ff As Integer
  307. Dim Str As String
  308. ff = FreeFile()
  309. Open FileName For Binary Access Read As #ff
  310. Str = Space(LOF(ff))
  311. Get #ff, , Str
  312. Close #ff
  313. CalcFileCRC = CalcCRC(Str)
  314. End Function

Решение задачи: «CRC32: Дополнить файл для получения контрольной суммы FFFFFFFF»

textual
Листинг программы
  1. Option Explicit
  2.  
  3. Const poly As Long = &HEDB88320
  4.  
  5. Public Declare Function Mul Lib "msvbvm60.dll" Alias "_allmul" (ByVal dw1 As Long, ByVal Reserved As Long, ByVal dw3 As Long, ByVal Reserved As Long) As Long
  6.  
  7. Dim Tab_CRC(255)    As Long
  8. Dim pTable(255)     As Long
  9.  
  10. Sub Make_CRC_32_Table()
  11.     Dim bx&, cx&, eax&
  12.    
  13.     For bx = 0& To 255&
  14.         eax = bx
  15.         For cx = 0& To 7&
  16.             If (eax And 1) Then
  17.                 eax = ((eax And &HFFFFFFFE) \ 2&) And &H7FFFFFFF    'eax >> 1
  18.                eax = eax Xor poly
  19.             Else
  20.                 eax = ((eax And &HFFFFFFFE) \ 2&) And &H7FFFFFFF
  21.             End If
  22.         Next
  23.         Tab_CRC(bx) = eax
  24.         pTable(((eax And &HFF000000) \ &H1000000) And &HFF) = bx
  25.     Next
  26. End Sub
  27.  
  28. Sub SplitInto4bytes(Src As Long, bit3 As Byte, bit2 As Byte, bit1 As Byte, bit0 As Byte)
  29.     bit3 = ((Src And &HFF000000) \ &H1000000) And &HFF
  30.     bit2 = ((Src And &HFF0000) \ &H10000) And &HFF
  31.     bit1 = ((Src And &HFF00) \ &H100) And &HFF
  32.     bit0 = Src And &HFF
  33. End Sub
  34.  
  35. Public Sub RecoverCRC()
  36.    
  37.     Dim oldCRC&, newCRC&, ChkCRC&, a(3) As Byte, b(3) As Byte, c(3) As Byte, d(3) As Byte, e(3) As Byte, f(3) As Byte, r(3) As Byte, i&
  38.     Dim InitStri$, NewStri$, PatchAddr&, ForwardCRC&, BackwardCRC&, AddBytes$
  39.    
  40.     ' Исходные данные
  41.    InitStri = "Some Data"
  42.    
  43.     ' Указать адрес для добавочных (или заменяемых) байтов (считаем с нуля).
  44.    PatchAddr = Len(InitStri) 'Len(InitStri) - пишем в конец
  45.    
  46.     If PatchAddr > Len(InitStri) Then Err.Raise 14
  47.    
  48.     Make_CRC_32_Table
  49.    
  50.     ' Какую КС нужно получить
  51.    newCRC = &H12345678
  52.     oldCRC = CalcCRC(InitStri)
  53.    
  54.     Debug.Print "Initial CRC: " & Hex(oldCRC)
  55.     Debug.Print "New CRC:     " & Hex(newCRC)
  56.    
  57.     ForwardCRC = CalcCRC(Left$(InitStri, PatchAddr)) Xor -1
  58.     BackwardCRC = newCRC Xor -1
  59.    
  60.     If (PatchAddr + 4) < Len(InitStri) Then BackwardCRC = CalcCRCReverse(Right$(InitStri, Len(InitStri) - (PatchAddr + 4)), BackwardCRC)
  61.    
  62.     SplitInto4bytes ForwardCRC, a(3), a(2), a(1), a(0)
  63.     SplitInto4bytes BackwardCRC, f(3), f(2), f(1), f(0)
  64.    
  65.     e(3) = f(3):                            SplitInto4bytes Tab_CRC(pTable(e(3))), e(3), e(2), e(1), e(0)
  66.     d(3) = f(2) Xor e(2):                   SplitInto4bytes Tab_CRC(pTable(d(3))), d(3), d(2), d(1), d(0)
  67.     c(3) = f(1) Xor e(1) Xor d(2):          SplitInto4bytes Tab_CRC(pTable(c(3))), c(3), c(2), c(1), c(0)
  68.     b(3) = f(0) Xor e(0) Xor d(1) Xor c(2): SplitInto4bytes Tab_CRC(pTable(b(3))), b(3), b(2), b(1), b(0)
  69.    
  70.     r(3) = pTable(b(3)) Xor a(0)
  71.     r(2) = pTable(c(3)) Xor b(0) Xor a(1)
  72.     r(1) = pTable(d(3)) Xor c(0) Xor b(1) Xor a(2)
  73.     r(0) = pTable(e(3)) Xor d(0) Xor c(1) Xor b(2) Xor a(3)
  74.    
  75.     AddBytes = Chr$(r(3)) & Chr$(r(2)) & Chr$(r(1)) & Chr$(r(0))
  76.    
  77.     ' Вставляем корректирующие байты в исходную строку
  78.    NewStri = InitStri
  79.     If PatchAddr - Len(InitStri) + 4 > 0 Then NewStri = NewStri & Space$(PatchAddr - Len(InitStri) + 4)
  80.     Mid(NewStri, PatchAddr + 1) = Chr$(r(3)) & Chr$(r(2)) & Chr$(r(1)) & Chr$(r(0))
  81.    
  82.     ' Контрольная проверка КС
  83.    ChkCRC = CalcCRC(NewStri)
  84.    
  85.     ' Если КС не совпадает
  86.    If ChkCRC <> newCRC Then Err.Raise 17
  87.    
  88.     Debug.Print "Check CRC:   " & Hex(ChkCRC)
  89.     Debug.Print "Исходная строка: " & InitStri
  90.     Debug.Print "Новая строка:    " & NewStri
  91.     Debug.Print "Адрес для вставки: " & PatchAddr
  92.     Debug.Print "Корректирующие байты: " & Hex(Mul(r(3), 0, &H1000000, 0) Or Mul(r(2), 0, &H10000, 0) Or Mul(r(1), 0, &H100, 0) Or r(0))
  93.     End
  94. End Sub
  95.  
  96. Public Function CalcCRC(Stri As String) As Long
  97.     Dim CRC&, i&, m&, n&
  98.  
  99.     If Tab_CRC(1) = 0 Then Make_CRC_32_Table
  100.  
  101.     CRC = -1
  102.  
  103.     For i = 1& To Len(Stri)
  104.         m = Asc(Mid$(Stri, i, 1&))
  105.         n = (CRC Xor m) And &HFF&
  106.         CRC = (Tab_CRC(n) Xor (((CRC And &HFFFFFF00) \ &H100) And &HFFFFFF)) And -1  ' Tab ^ (crc >> 8)
  107.    Next
  108.  
  109.     CalcCRC = -(CRC + 1&)
  110. End Function
  111.  
  112. Public Function CalcCRCReverse(Stri As String, Optional nextValue As Long = -1) As Long
  113.     Dim CRC&, i&, m&, n&, prevValueL&, prevValueH&, b3 As Byte
  114.  
  115.     If Tab_CRC(1) = 0 Then Make_CRC_32_Table
  116.  
  117.     CRC = nextValue
  118.  
  119.     For i = Len(Stri) To 1 Step -1
  120.         m = Asc(Mid$(Stri, i, 1&))
  121.         b3 = ((CRC And &HFF000000) \ &H1000000) And &HFF
  122.         prevValueL = (pTable(b3) Xor m) And &HFF
  123.         prevValueH = Mul(CRC Xor Tab_CRC(pTable(b3)), 0, &H100, 0)  ' << 8
  124.        CRC = prevValueH Or prevValueL
  125.     Next
  126.    
  127.     CalcCRCReverse = CRC
  128. End Function

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.933 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы