Advertisement
Guest User

Untitled

a guest
Jun 20th, 2019
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.03 KB | None | 0 0
  1. //****************************************************************************
  2.  
  3. DWORD Crc32Fast(DWORD Crc, DWORD Data)
  4. {
  5. static const DWORD CrcTable[16] = { // Nibble lookup table for 0x04C11DB7 polynomial
  6. 0x00000000,0x04C11DB7,0x09823B6E,0x0D4326D9,0x130476DC,0x17C56B6B,0x1A864DB2,0x1E475005,
  7. 0x2608EDB8,0x22C9F00F,0x2F8AD6D6,0x2B4BCB61,0x350C9B64,0x31CD86D3,0x3C8EA00A,0x384FBDBD };
  8.  
  9. Crc = Crc ^ Data; // Apply all 32-bits
  10.  
  11. // Process 32-bits, 4 at a time, or 8 rounds
  12.  
  13. Crc = (Crc << 4) ^ CrcTable[Crc >> 28]; // Assumes 32-bit reg, masking index to 4-bits
  14. Crc = (Crc << 4) ^ CrcTable[Crc >> 28]; // 0x04C11DB7 Polynomial used in STM32
  15. Crc = (Crc << 4) ^ CrcTable[Crc >> 28];
  16. Crc = (Crc << 4) ^ CrcTable[Crc >> 28];
  17. Crc = (Crc << 4) ^ CrcTable[Crc >> 28];
  18. Crc = (Crc << 4) ^ CrcTable[Crc >> 28];
  19. Crc = (Crc << 4) ^ CrcTable[Crc >> 28];
  20. Crc = (Crc << 4) ^ CrcTable[Crc >> 28];
  21.  
  22. return(Crc);
  23. }
  24.  
  25. //****************************************************************************
  26.  
  27. DWORD Crc32FastBlock(DWORD Crc, DWORD Size, DWORD *Buffer) // 32-bit units
  28. {
  29. while(Size--)
  30. Crc = Crc32Fast(Crc, *Buffer++);
  31.  
  32. return(Crc);
  33. }
  34.  
  35. CRC_TABLE = (0x00000000, 0x04C11DB7, 0x09823B6E, 0x0D4326D9,
  36. 0x130476DC, 0x17C56B6B, 0x1A864DB2, 0x1E475005,
  37. 0x2608EDB8, 0x22C9F00F, 0x2F8AD6D6, 0x2B4BCB61,
  38. 0x350C9B64, 0x31CD86D3, 0x3C8EA00A, 0x384FBDBD)
  39.  
  40.  
  41. def dword(value):
  42. return value & 0xFFFFFFFF
  43.  
  44.  
  45. def crc32_fast(crc, data):
  46. crc, data = dword(crc), dword(data)
  47. crc ^= data
  48. for _ in range(8):
  49. crc = dword(crc << 4) ^ CRC_TABLE[crc >> 28]
  50. return crc
  51.  
  52.  
  53. def crc32_fast_block(crc, buffer):
  54. for data in buffer:
  55. crc = crc32_fast(crc, data)
  56. return crc
  57.  
  58.  
  59. def crc32_fast_bytes(crc, bytes_data, byteorder='big'):
  60. if len(bytes_data) & 3:
  61. raise ValueError('bytes_data length must be multiple of four')
  62. for index in range(0, len(bytes_data), 4):
  63. data = int.from_bytes(bytes_data[index:index+4], byteorder)
  64. crc = crc32_fast(crc, data)
  65. return crc
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement