Подсчет CRC32

Тема в разделе "WASM.A&O", создана пользователем Marik, 25 сен 2007.

  1. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    Доброго времени суток!
    Вопрос собственно в следующем:
    по статье http://www.wasm.ru/article.php?article=vgw10 сделал подсчет crc32, но это число (crc32) почему то не совпадает с числом, которое выдает другая готовая прога для подсчета crc например вот эта http://www34.brinkster.com/dizzyk/crc32.asp
    Я не силен в делфях, поэтому не разобрал код подсчета crc в это проге... или может есть разные методы???
     
  2. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    хм почему в кернеле? =)))
    в проге по ссылке следуюший алгоритм подсчета
    Код (Text):
    1. CODE:00404FB4 sub_404FB4      proc near               ; CODE XREF: sub_404FEC+DCp
    2. CODE:00404FB4                 push    ebx
    3. CODE:00404FB5                 push    esi
    4. CODE:00404FB6                 test    ecx, ecx
    5. CODE:00404FB8                 jz      short loc_404FE9
    6. CODE:00404FBA                 mov     ebx, edx
    7. CODE:00404FBC                 not     dword ptr [eax]
    8. CODE:00404FBE                 mov     edx, ecx
    9. CODE:00404FC0                 dec     edx
    10. CODE:00404FC1                 test    edx, edx
    11. CODE:00404FC3                 jl      short loc_404FE7
    12. CODE:00404FC5                 inc     edx
    13. CODE:00404FC6
    14. CODE:00404FC6 loc_404FC6:                             ; CODE XREF: sub_404FB4+31j
    15. CODE:00404FC6                 mov     ecx, [eax]
    16. CODE:00404FC8                 movzx   esi, byte ptr [ebx]
    17. CODE:00404FCB                 xor     ecx, esi
    18. CODE:00404FCD                 and     ecx, 0FFh
    19. CODE:00404FD3                 mov     ecx, ds:dword_40A0C4[ecx*4]
    20. CODE:00404FDA                 mov     esi, [eax]
    21. CODE:00404FDC                 shr     esi, 8
    22. CODE:00404FDF                 xor     ecx, esi
    23. CODE:00404FE1                 mov     [eax], ecx
    24. CODE:00404FE3                 inc     ebx
    25. CODE:00404FE4                 dec     edx
    26. CODE:00404FE5                 jnz     short loc_404FC6
    27. CODE:00404FE7
    28. CODE:00404FE7 loc_404FE7:                             ; CODE XREF: sub_404FB4+Fj
    29. CODE:00404FE7                 not     dword ptr [eax]
    30. CODE:00404FE9
    31. CODE:00404FE9 loc_404FE9:                             ; CODE XREF: sub_404FB4+4j
    32. CODE:00404FE9                 pop     esi
    33. CODE:00404FEA                 pop     ebx
    34. CODE:00404FEB                 retn
    35. CODE:00404FEB sub_404FB4      endp
    Т.е. что-то вроде
    Код (Text):
    1. unsigned int crc(unsigned char *buf, int cnt)
    2. {
    3.  long crc_table[256];
    4.  unsigned long t;
    5.  unsigned long crc32;
    6.  for(int i=0;i<256;i++)
    7.  {
    8.   t=i;
    9.   for(int j=8;j>0;j--)
    10.   {
    11.    if(t&1)
    12.     t=(t>>1)^0xedb88320;// примитивный полином
    13.    else
    14.     t>>=1;
    15.   };
    16.   crc_table[i] = t;
    17.  };
    18.  crc32=0xffffffff;
    19.  for(int i=0;i<cnt;i++) { crc32=crc_table[(crc32^(*buf++))&0xff]^(crc32>>8);};
    20.  crc32=crc32^0xffffffff;
    21.  return crc32;
    22. };
    только таблица подсчитана еще до компиляции
    возможно при расчете таблицы был использован другой полином. Покури это - http://wasm.ru/docs/5/crc.zip
     
  3. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    сколько можно одно и тоже талдычить, инфы море, первая считает по строке ASCIIZ, вторая память с опрделённой длиной
    Код (Text):
    1. GetCRC32Z proc uses ebx edx, lpData:DWORD
    2.    
    3.     xor eax,eax
    4.     mov edx,lpData
    5.     not eax
    6. @1: xor al,[edx]
    7.     inc edx
    8.     mov bl,8
    9. @2: shr eax,1
    10.     jnc @3
    11.     xor eax,0EDB88320h ;0EDB88320h
    12. @3: dec bl
    13.     jnz @2
    14.     cmp byte ptr [edx],0
    15.     jnz @1
    16.     not eax
    17.     ret
    18. GetCRC32Z endp
    19.  
    20. GetCRC32L proc uses ebx edx ecx, lpData:DWORD, dwLength ;get CRC32 with length
    21.        
    22.     mov ecx, dwLength
    23.     add ecx, lpData    
    24.     xor eax,eax
    25.     mov edx,lpData
    26.     not eax
    27. @1: xor eax,[edx]
    28.     add edx, 4
    29.     mov bl,32
    30. @2: shr eax,1
    31.     jnc @3
    32.     xor eax,0EDB88320h ;0EDB88320h
    33. @3: dec bl
    34.     jnz @2
    35.     cmp edx, ecx
    36.    
    37.     jb @1
    38.     not eax
    39.     ret
    40. GetCRC32L endp
     
  4. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    Спасибо за пояснение
     
  5. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon