|
CRC32
|
|||
---|---|---|---|
#18+
Как вычислить контрольную сумму CRC 32*.dbf файла средствами fOXa? может есть у кого готовая процедура? Нужно срочно!!! и на fox!!! ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2008, 13:54 |
|
CRC32
|
|||
---|---|---|---|
#18+
В 9-ке есть SYS(2017) - это CRC32 Есть еще SYS(2007) это CRC16 не подойдет? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2008, 14:36 |
|
CRC32
|
|||
---|---|---|---|
#18+
songv, Вот ведь. Не помню! SYS(2007) в семерке считает CRC32 или только CRC16? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2008, 14:36 |
|
CRC32
|
|||
---|---|---|---|
#18+
это что-то не то. sys (2007)сравнивает текстовую строку ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2008, 14:47 |
|
CRC32
|
|||
---|---|---|---|
#18+
А файл в строку загнать нельзя? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2008, 14:49 |
|
CRC32
|
|||
---|---|---|---|
#18+
songvэто что-то не то. sys (2007)сравнивает текстовую строку Не сравнивает, а считает CRC16 Файл можно в строку через FileToStr() ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2008, 14:56 |
|
CRC32
|
|||
---|---|---|---|
#18+
у меня 5 файлов (ежемесячный пакет данных) Каждый составляет несколько тысяч записей. И их все в строку? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2008, 14:59 |
|
CRC32
|
|||
---|---|---|---|
#18+
Ну в строку. И в чем проблема? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2008, 15:01 |
|
CRC32
|
|||
---|---|---|---|
#18+
Можно так * Для строки ?CRC32('Hello!') 9D2ACC56 или 2636827734 * Для файла m.infile=FOPEN('c:\autoexec.bat') ?CRC32(m.infile) ********************************************************** Function GetCRC32 ********************************************************** Lparameter String Local x,i,c,j,crc32 * Сервисный массив m.crc32=HToInt('FFFFFFFF') IF TYPE('CRCarr')='U' PUBLIC ARRAY CRCarr(256) m.Magic=HToInt('EDB88320') For i=1 To 256 c=m.i-1 For j=1 To 8 If Int(m.c/2)#(m.c/2) c=Bitrshift(m.c,1) c=Bitxor(m.c,m.Magic) Else c=Bitrshift(m.c,1) Endif Endfor CRCarr(m.i)=Iif(m.c<0,m.crc32+1+m.c,m.c) ENDFOR ENDIF * Вычисление кода Do Case Case Type('m.string')='C' For x=1 To Len(m.string) m.x1=Asc(Substr(m.string,m.x,1)) m.crc32=Bitxor(Bitrshift(m.crc32,8),CRCarr(Bitxor(m.x1,Bitand(m.crc32,255))+1)) Endfor Case Type('m.string')='N' Do While !Feof(m.string) m.x1=Asc(Fread(m.string,1)) m.crc32=Bitxor(Bitrshift(m.crc32,8),CRCarr(Bitxor(m.x1,Bitand(m.crc32,255))+1)) Enddo Otherwise Return '' Endcase Return IntToH(Bitxor(m.crc32,HToInt('FFFFFFFF'))) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2008, 17:26 |
|
CRC32
|
|||
---|---|---|---|
#18+
Можно еще так. На больших объемах быстрее будет. Вызов для строки ?CRC32("AAAAA") Вызов для файла ?CRC32(filetostr("MyFile.ext")) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2008, 14:24 |
|
CRC32
|
|||
---|---|---|---|
#18+
Если действительно критична скорость, можно взять этот С-шный код, уже адаптированный для fll. Работать будет в любом фоксе, от fpd до vfp9 Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2008, 23:48 |
|
CRC32
|
|||
---|---|---|---|
#18+
XAndyЕсли действительно критична скорость, можно взять этот С-шный код Конечно интересно было бы сравнить скорость на файлах порядка 100 - 500 Mb, но сдается мне , что мой метод будет чуток побыстрее, да и fll-ку лишнюю таскать не надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2008, 10:32 |
|
CRC32
|
|||
---|---|---|---|
#18+
Leonid_Rigaинтересно было бы сравнить скорость на файлах порядка 100 - 500 Mb, но сдается мне , что мой метод будет чуток побыстрее, да и fll-ку лишнюю таскать не надо. Может и так. Вот скомпилил fll, можно попробовать ;) (только первый вызов игнорируй, кэширование и всё такое...). Встроенные в fll функции хороши прежде всего тем, что в фоксовском SQL воспринимаются как родные. Если SQL + нужна UDF + приличные объёмы данных, то это лучший выход. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2008, 14:53 |
|
CRC32
|
|||
---|---|---|---|
#18+
Интересно получается. На 128 Mb мой метод дает ~1.2 с, метод с fll дает ~0.8 c. Если мой медод изменить так, что в функцию CallWindowProc передается не сама строка, а уже готовый пойнтер, то тогда требуется ~0.6 с (значит примерно 0.6 с тратится на создание второй копии строки при передаче в dll-ку), т.е. примерно то соотношение с fll-кой, которое я и предполагал. Единственное разумное объяснение этому, что fll-ка работает со строкой, не создавая второй ее копии. Неплохо бы это проверить. Если это верно, то тогда с помощью fll-ки можно написать быстрый аналог substr. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2008, 23:34 |
|
CRC32
|
|||
---|---|---|---|
#18+
Леонид, тут и проверять нечего, я писал именно так, не создавая копию строки, а обрабатывая исходную ;) Большинство функций так и делаю (особенно требующих высокой скорости, вроде шифрования). Недостаток - нельзя напрямую использовать с memo-полями (для memo обычно пишется функция-оболочка), впрочем это редко требуется. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2008, 14:04 |
|
CRC32
|
|||
---|---|---|---|
#18+
Да нет, тут не в этом дело. Когда строка передается в dll-ку (DECLARE ...), независимо, по значению или по ссылке, всегда создается ее копия, и dll-ка работает уже с копией строки. Если строка передавалась по ссылке, то результат затем копируется обратно в фоксовскую строку. У меня создалось впечатление, что fll-ка так не поступает, а работает с фоксовской строкой непосредственно. Если это так, то пожалуй на этом в некоторых случаях можно здорово сэкономить. Так, фоксовская SUBSTR тоже сначала копирует всю строку в новое место, а затем вызывает стандартную WinAPI функцию. Поэтому для больших строк использовать SUBSTR очень нерационально, особенно в цикле. Может быть с помощью fll эту проблему можно решить? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2008, 14:55 |
|
CRC32
|
|||
---|---|---|---|
#18+
Leonid_RigaУ меня создалось впечатление, что fll-ка так не поступает, а работает с фоксовской строкой непосредственно. Зависит от программиста. Подразумевается, что програмер сам скопирует строку для обработки (в хелпе в примерах так и делается). Но можно этого и не делать: Код: plaintext 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2008, 16:51 |
|
CRC32
|
|||
---|---|---|---|
#18+
А почему Вы думаете, что получаете пойнтер на оригинал строки, а не на ее копию? Ведь поступив в точности так же с вызовом dll-ки через DECLARE, Вы получите пойнтер на копию строки. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2008, 18:02 |
|
CRC32
|
|||
---|---|---|---|
#18+
Предполагаю. Иначе зачем во всех фоксовских примерах на С для строки-параметра выделяется новый кусок памяти и срока туда копируется? Кроме того, если бы в качестве параметров передавалась копия, то та функция crcr32 работала бы и с текстом, полученным из memo ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2008, 11:31 |
|
CRC32
|
|||
---|---|---|---|
#18+
XAndyПредполагаю. Хорошо бы проверить. Наверное проще всего - написать простенький fll-аналог SUBSTR. Функция принимает строку STR и число N, и возвращает ASCII код N-го символа строки. Если для достаточно больших строк (порядка 100 Kb) она будет работать заметно быстрее, чем встроенная фоксовская, то тогда действительно, копирования не происходит. Проверять можно на таком коде Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2008, 22:40 |
|
|
start [/forum/topic.php?fid=41&gotonew=1&tid=1587135]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
45ms |
get topic data: |
11ms |
get first new msg: |
7ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
others: | 11ms |
total: | 170ms |
0 / 0 |