fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. // Below from crc.h
  6.  
  7. #ifndef _crc_h
  8. #define _crc_h
  9.  
  10. //El valor CHECK es el resultado de realizar el calculo CRC para el char[] = "123456789";
  11. //The CHECK value is the result of making the checksum of the char[] = "123456789";
  12. /*
  13.  * Valores sacados de la pagina http://c...content-available-to-author-only...e.net/crcmod.predefined.html Es posible que alguno este mal.
  14.  * This values have been taken from http://c...content-available-to-author-only...e.net/crcmod.predefined.html some of them could be wrong
  15.  Name Polynomial Reversed? Init-value XOR-out Check
  16. crc-8 0x07 False 0x00 0x00 0xF4
  17. crc-8-darc 0x39 True 0x00 0x00 0x15
  18. crc-8-i-code 0x1D False 0xFD 0x00 0x7E
  19. crc-8-itu 0x07 False 0x55 0x55 0xA1
  20. crc-8-maxim 0x131 True 0x00 0x00 0xA1
  21. crc-8-rohc 0x07 True 0xFF 0x00 0xD0
  22. crc-8-wcdma 0x9B True 0x00 0x00 0x25
  23. crc-16 0x8005 True 0x0000 0x0000 0xBB3D
  24. crc-16-buypass 0x8005 False 0x0000 0x0000 0xFEE8
  25. crc-16-dds-110 0x8005 False 0x800D 0x0000 0x9ECF
  26. crc-16-dect 0x0589 False 0x0001 0x0001 0x007E
  27. crc-16-dnp 0x3D65 True 0xFFFF 0xFFFF 0xEA82
  28. crc-16-en-13757 0x3D65 False 0xFFFF 0xFFFF 0xC2B7
  29. crc-16-genibus 0x1021 False 0x0000 0xFFFF 0xD64E
  30. crc-16-maxim 0x8005 True 0xFFFF 0xFFFF 0x44C2
  31. crc-16-mcrf4xx 0x1021 True 0xFFFF 0x0000 0x6F91
  32. crc-16-riello 0x1021 True 0x554D 0x0000 0x63D0
  33. crc-16-t10-dif 0x8BB7 False 0x0000 0x0000 0xD0DB
  34. crc-16-teledisk 0xA097 False 0x0000 0x0000 0x0FB3
  35. crc-16-usb 0x8005 True 0x0000 0xFFFF 0xB4C8
  36. x-25 0x1021 True 0x0000 0xFFFF 0x906E
  37. xmodem 0x1021 False 0x0000 0x0000 0x31C3
  38. modbus 0x8005 True 0xFFFF 0x0000 0x4B37
  39. kermit [1] 0x1021 True 0x0000 0x0000 0x2189
  40. crc-ccitt-false [1] 0x1021 False 0xFFFF 0x0000 0x29B1
  41. crc-aug-ccitt [1] 0x1021 False 0x1D0F 0x0000 0xE5CC
  42. crc-24 0x864CFB False 0xB704CE 0x000000 0x21CF02
  43. crc-24-flexray-a 0x5D6DCB False 0xFEDCBA 0x000000 0x7979BD
  44. crc-24-flexray-b 0x5D6DCB False 0xABCDEF 0x000000 0x1F23B8
  45. crc-32 0x04C11DB7 True 0x00000000 0xFFFFFFFF 0xCBF43926
  46. crc-32-bzip2 0x04C11DB7 False 0xFFFFFFFF 0x00000000 0xFC891918
  47. crc-32c 0x1EDC6F41 True 0x00000000 0xFFFFFFFF 0xE3069283
  48. crc-32d 0xA833982B True 0x00000000 0xFFFFFFFF 0x87315576
  49. crc-32-mpeg 0x04C11DB7 False 0xFFFFFFFF 0x00000000 0x0376E6E7
  50. posix 0x04C11DB7 False 0xFFFFFFFF 0xFFFFFFFF 0x765E7680
  51. crc-32q 0x814141AB False 0x00000000 0x00000000 0x3010BF7F
  52. jamcrc 0x04C11DB7 True 0xFFFFFFFF 0x00000000 0x340BC6D9
  53. xfer 0x000000AF False 0x00000000 0x00000000 0xBD0BE338
  54. crc-64 0x000000000000001B True 0x0000000000000000 0x0000000000000000 0x46A5A9388A5BEFFE
  55. crc-64-we 0x42F0E1EBA9EA3693 False 0x0000000000000000 0xFFFFFFFFFFFFFFFF 0x62EC59E3F1A4F00A
  56. crc-64-jones 0xAD93D23594C935A9 True 0xFFFFFFFFFFFFFFFF 0x0000000000000000 0xCAA717168609F281
  57.  
  58.  */
  59.  
  60. #include <stdint.h>
  61.  
  62.  
  63.  
  64. #define TRUE 1
  65. #define FALSE 0
  66.  
  67.  
  68.  
  69. //Indicate here the CRC algorithm that you want to use
  70. #define CRC_32
  71.  
  72. //Indicate here if you want to do the calculation using a LookupTable
  73. #define CALCULATE_LOOKUPTABLE TRUE
  74.  
  75.  
  76. #if defined(CRC_8)
  77.  
  78. typedef uint8_t crc;
  79.  
  80. #define POLYNOMIAL 0x07
  81. #define INITIAL_VALUE 0
  82. #define FINAL_XOR_VALUE 0
  83. #define REVERSED_DATA FALSE
  84. #define REVERSED_OUT FALSE
  85.  
  86. #elif defined(CRC_CCITT)
  87.  
  88. typedef uint16_t crc;
  89.  
  90. #define POLYNOMIAL 0x1021
  91. #define INITIAL_VALUE 0xFFFF
  92. #define FINAL_XOR_VALUE 0
  93. #define REVERSED_DATA FALSE
  94. #define REVERSED_OUT FALSE
  95.  
  96. #elif defined(MODBUS)
  97.  
  98. typedef uint16_t crc;
  99.  
  100. #define POLYNOMIAL 0x8005
  101. #define INITIAL_VALUE 0xFFFF
  102. #define FINAL_XOR_VALUE 0
  103. #define REVERSED_DATA TRUE
  104. #define REVERSED_OUT FALSE
  105.  
  106.  
  107.  
  108. #elif defined(CRC_16)
  109.  
  110. typedef uint16_t crc;
  111.  
  112. #define POLYNOMIAL 0x8005
  113. #define INITIAL_VALUE 0x0000
  114. #define FINAL_XOR_VALUE 0x0000
  115. #define REVERSED_DATA TRUE
  116. #define REVERSED_OUT FALSE
  117.  
  118. #elif defined(CRC_24)
  119. //Since is impossible to define a 24bit variable and i need to use and structure instead, what i have done is just put the WIDTH directly. In this case the valid part from the result,
  120. //will be the less significat 24bits (&0xFFF) the rest must be discarted.
  121.  
  122. //Como es imposible definir variables de 24bits y necesito crear una estructura, lo que he hecho es definir la anchura directamente para poder conseguir un resultado valido.
  123. //Para este caso la parte con la que debemos quedarnos son los 24 bits de menos peso (&0xFFF), la parte alta debemos de descartarla
  124. typedef uint32_t crc;
  125.  
  126. #define POLYNOMIAL 0x864CFB
  127. #define INITIAL_VALUE 0xB704CE
  128. #define FINAL_XOR_VALUE 0x000000
  129. #define REVERSED_DATA FALSE
  130. #define REVERSED_OUT FALSE
  131. #define WIDTH (24)
  132.  
  133. #elif defined(CRC_32)
  134.  
  135. typedef uint32_t crc;
  136.  
  137. #define POLYNOMIAL 0x04C11DB7
  138. #define INITIAL_VALUE 0xFFFFFFFF
  139. #define FINAL_XOR_VALUE 0xFFFFFFFF
  140. #define REVERSED_DATA TRUE
  141. #define REVERSED_OUT FALSE
  142.  
  143.  
  144. #elif defined(CRC_32_BZIP2)
  145.  
  146. typedef uint32_t crc;
  147.  
  148. #define POLYNOMIAL 0x04C11DB7
  149. #define INITIAL_VALUE 0xFFFFFFFF
  150. #define FINAL_XOR_VALUE 0
  151. #define REVERSED_DATA FALSE
  152. #define REVERSED_OUT TRUE
  153.  
  154.  
  155. #elif defined(CRC_64_JONES)
  156.  
  157. typedef uint64_t crc;
  158.  
  159. #define POLYNOMIAL 0xAD93D23594C935A9
  160. #define INITIAL_VALUE 0xFFFFFFFFFFFFFFFF
  161. #define FINAL_XOR_VALUE 0
  162. #define REVERSED_DATA TRUE
  163. #define REVERSED_OUT FALSE
  164.  
  165.  
  166. #else
  167.  
  168. #error "Debes definir un algoritmo CRC"
  169. #error "You should define at least one algorithm"
  170.  
  171. #endif
  172.  
  173. #if (CALCULATE_LOOKUPTABLE == FALSE)
  174. #define F_CRC_InicializaTabla()
  175. #else
  176. void F_CRC_InicializaTabla(void);
  177. #endif
  178. crc F_CRC_CalculaCheckSum(uint8_t const AF_Datos[], uint16_t VF_nBytes);
  179.  
  180. #endif
  181.  
  182. // crc.c below
  183. /*
  184.  * Derive parameters from the standard-specific parameters in crc.h.
  185.  */
  186. #ifndef WIDTH
  187. #define WIDTH (8 * sizeof(crc))
  188. #endif
  189. #define TOPBIT (((crc)1) << (WIDTH - 1))
  190.  
  191. #if (REVERSED_DATA == TRUE)
  192. #define FP_reflect_DATA(_DATO) ((uint8_t)(FP_reflect((_DATO), 8)&0xFF))
  193. #define FP_reflect_CRCTableValue(_CRCTableValue) ((crc) FP_reflect((_CRCTableValue), WIDTH))
  194. #else
  195. #define FP_reflect_DATA(_DATO) (_DATO)
  196. #define FP_reflect_CRCTableValue(_CRCTableValue) (_CRCTableValue)
  197.  
  198. #endif
  199.  
  200. #if (CALCULATE_LOOKUPTABLE == TRUE)
  201. static crc A_crcLookupTable[256] = {0};
  202. #endif
  203. /*********************************************************************
  204.  *
  205.  * Function: FP_reflect()
  206.  *
  207.  * Description: A value/register is reflected if it's bits are swapped around its centre.
  208.  * For example: 0101 is the 4-bit reflection of 1010
  209.  *
  210.  * Descripción: Un valor es reflejado cuando sus bits son intercambiados utilizando como punto de referencia el centro.
  211.  * Por ejemplo: 0101 es el reflejo de 1010
  212.  *
  213.  *********************************************************************/
  214. #if (REVERSED_DATA == TRUE)
  215. static crc FP_reflect(crc VF_dato, uint8_t VF_nBits)
  216. {
  217. crc VP_reflection = 0;
  218. uint8_t VP_Pos_bit = 0;
  219.  
  220. for (VP_Pos_bit = 0; VP_Pos_bit < VF_nBits; VP_Pos_bit++)
  221. {
  222. if ((VF_dato & 1) == 1)
  223. {
  224. VP_reflection |= (((crc)1) << ((VF_nBits - 1) - VP_Pos_bit));
  225. }
  226.  
  227. VF_dato = (VF_dato >> 1);
  228. }
  229. return (VP_reflection);
  230. }
  231.  
  232. #endif
  233.  
  234. /*********************************************************************
  235.  *
  236.  * Function: F_CRC_ObtenValorDeTabla()
  237.  *
  238.  * Description: Obtains the Table value
  239.  * Descripción: Obtiene el valor de la tabla
  240.  *
  241.  *
  242.  *********************************************************************/
  243. static crc F_CRC_ObtenValorDeTabla(uint8_t VP_Pos_Tabla)
  244. {
  245. crc VP_CRCTableValue = 0;
  246. uint8_t VP_Pos_bit = 0;
  247.  
  248. VP_CRCTableValue = ((crc) FP_reflect_DATA(VP_Pos_Tabla)) << (WIDTH - 8);
  249.  
  250. for (VP_Pos_bit = 0; VP_Pos_bit < 8; VP_Pos_bit++)
  251. {
  252. if (VP_CRCTableValue & TOPBIT)
  253. {
  254. VP_CRCTableValue = (VP_CRCTableValue << 1) ^ POLYNOMIAL;
  255. }
  256. else
  257. {
  258. VP_CRCTableValue = (VP_CRCTableValue << 1);
  259. }
  260. }
  261. return (FP_reflect_CRCTableValue(VP_CRCTableValue));
  262. }
  263.  
  264. #if (CALCULATE_LOOKUPTABLE == TRUE)
  265.  
  266. /*********************************************************************
  267.  *
  268.  * Function: F_CRC_InicializaTabla()
  269.  *
  270.  * Description: Create the lookup table for the CRC
  271.  * Descripción: Crea la tabla de lookup para el computo del CRC
  272.  *
  273.  *
  274.  *********************************************************************/
  275. void F_CRC_InicializaTabla(void)
  276. {
  277. uint16_t VP_Pos_Array = 0;
  278.  
  279. for (VP_Pos_Array = 0; VP_Pos_Array < 256; VP_Pos_Array++)
  280. {
  281. A_crcLookupTable[VP_Pos_Array] = F_CRC_ObtenValorDeTabla((uint8_t)(VP_Pos_Array &0xFF));
  282.  
  283. }
  284.  
  285. }
  286.  
  287.  
  288.  
  289. /*********************************************************************
  290.  *
  291.  * Function: F_CRC_CalculaCheckSumDeTabla()
  292.  *
  293.  * Description: Calculate the CRC value from a Lookup Table.
  294.  *
  295.  * Notes: F_CRC_InicializaTabla() must be called first.
  296.  * Since AF_Datos is a char array, it is possible to compute any kind of file or array.
  297.  * Notes: F_CRC_InicializaTabla() debe ser llamado primero
  298.  * Como AF_Datos es un array de char, tiene capacidad para calcular la checksum de cualquier fichero o array.
  299.  *
  300.  * Returns: The CRC of the AF_Datos.
  301.  * Retorna: El computo del CRC
  302.  *
  303.  *********************************************************************/
  304. crc F_CRC_CalculaCheckSum(uint8_t const AF_Datos[], uint16_t VF_nBytes)
  305. {
  306. crc VP_CRCTableValue = INITIAL_VALUE;
  307. uint16_t VP_bytes = 0;
  308.  
  309. for (VP_bytes = 0; VP_bytes < VF_nBytes; VP_bytes++)
  310. {
  311. #if (REVERSED_DATA == TRUE)
  312. VP_CRCTableValue = (VP_CRCTableValue >> 8) ^ A_crcLookupTable[((uint8_t)(VP_CRCTableValue & 0xFF)) ^ AF_Datos[VP_bytes]];
  313. #else
  314. VP_CRCTableValue = (VP_CRCTableValue << 8) ^ A_crcLookupTable[((uint8_t)((VP_CRCTableValue >> (WIDTH - 8)) & 0xFF)) ^ AF_Datos[VP_bytes]];
  315. #endif
  316. }
  317.  
  318. if ((8 * sizeof(crc)) > WIDTH)
  319. {
  320. VP_CRCTableValue = VP_CRCTableValue & ((((crc)(1)) << WIDTH) - 1);
  321. }
  322.  
  323. #if (REVERSED_OUT == FALSE)
  324. return (VP_CRCTableValue ^ FINAL_XOR_VALUE);
  325. #else
  326. return (~VP_CRCTableValue ^ FINAL_XOR_VALUE);
  327. #endif
  328.  
  329. }
  330. #else
  331.  
  332.  
  333. /*********************************************************************
  334.  *
  335.  * Function: F_CRC_CalculaCheckSumSinTabla()
  336.  *
  337.  * Description: Calculate the CRC value withouth a lookup table
  338.  * Description: Calculate el CRC sin tabla de lookup
  339.  *
  340.  * Notes:
  341.  *
  342.  * Returns: The CRC of the AF_Datos.
  343.  * Retorna: El computo de CRC de AF_DAtos
  344.  *
  345.  *********************************************************************/
  346. crc F_CRC_CalculaCheckSum(uint8_t const AF_Datos[], int16_t VF_nBytes)
  347. {
  348. crc VP_CRCTableValue = INITIAL_VALUE;
  349. int16_t VP_bytes = 0;
  350.  
  351. for (VP_bytes = 0; VP_bytes < VF_nBytes; VP_bytes++)
  352. {
  353. #if (REVERSED_DATA == TRUE)
  354. VP_CRCTableValue = (VP_CRCTableValue >> 8) ^ F_CRC_ObtenValorDeTabla(((uint8_t)(VP_CRCTableValue & 0xFF)) ^ AF_Datos[VP_bytes]);
  355. #else
  356. VP_CRCTableValue = (VP_CRCTableValue << 8) ^ F_CRC_ObtenValorDeTabla(((uint8_t)((VP_CRCTableValue >> (WIDTH - 8)) & 0xFF)) ^ AF_Datos[VP_bytes]);
  357. #endif
  358. }
  359.  
  360. if ((8 * sizeof(crc)) > WIDTH)
  361. {
  362. VP_CRCTableValue = VP_CRCTableValue & ((((crc)(1)) << WIDTH) - 1);
  363. }
  364.  
  365. #if (REVERSED_OUT == FALSE)
  366. return (VP_CRCTableValue ^ FINAL_XOR_VALUE);
  367. #else
  368. return (~VP_CRCTableValue ^ FINAL_XOR_VALUE);
  369. #endif
  370.  
  371. }
  372.  
  373. #endif
  374.  
  375. // main.c below
  376. // Put all include at the top of this "file", except crc.h
  377.  
  378. int main()
  379. {
  380.  
  381. int8_t A_Texto[124]; // PAS: Changed from 40
  382. crc CRC_Result = 0;
  383.  
  384. printf("CRC32 calculator\r\n");
  385. printf("For other CRCs change #define CRC_32 value in the crc.h file\r\n");
  386. printf("Insert value and press enter:");
  387.  
  388. fgets(A_Texto, 124, stdin); // PAS: Changed from 40
  389.  
  390.  
  391. F_CRC_InicializaTabla();
  392. CRC_Result = F_CRC_CalculaCheckSum(A_Texto, strlen(A_Texto)-1);
  393. printf("Result: 0x%X", CRC_Result);
  394. getchar();
  395. return 0;
  396. }
  397.  
  398.  
Success #stdin #stdout 0s 5292KB
stdin
engine\networkconfig.xml
stdout
CRC32 calculator
For other CRCs change #define CRC_32 value in the crc.h file
Insert value and press enter:Result: 0xAD2F5F86