Grobkonzept und CRC-Berechnungssoftware

This commit is contained in:
Matthias Biermann
2025-01-09 12:19:08 +01:00
parent c82523201c
commit 1dabc5074d
4 changed files with 112 additions and 0 deletions
+1
View File
@@ -0,0 +1 @@
build
+110
View File
@@ -0,0 +1,110 @@
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <stdlib.h>
// Berechnen einer 8 Bit CRC-Pruefsumme
uint8_t crc8(uint8_t* data, size_t size);
// Berechnen einer 32 Bit CRC-Pruefsumme
uint32_t crc32(uint8_t* inBytes, size_t size, uint32_t polynomial);
// Check einer 32 Bit CRC-Pruefsumme
int checkCrc32(uint8_t* data, size_t size, uint32_t crc, uint32_t polynomial);
int main()
{
char msg[] = "Hello World!\0\0\0\0";
uint32_t crc = crc32((uint8_t*) msg, strlen(msg)+4, 0x4C11DB7);
printf("CRC32 of '%s': 0x%08x\n\n", msg, crc);
int crcValid = checkCrc32((uint8_t*) msg, strlen(msg), crc, 0x4C11DB7);
// String einlesen und CRC32 ausgeben
// char input[1024];
// printf("String eingeben:\n");
// while (1)
// {
// // Liest eine Zeile von stdin ein und speichert sie in 'eingabe'
// if (fgets(input, sizeof(input), stdin) != NULL) {
// // Entfernt das Newline-Zeichen, das fgets hinzufügt
// size_t laenge = strlen(input);
// if (laenge > 0 && input[laenge - 1] == '\n') {
// input[laenge - 1] = '\0';
// }
// }
// crc = crc32((uint8_t*) input, strlen(input));
// printf("'%s' -> 0x%08x\n\n", input, crc);
// }
return 0;
}
uint8_t crc8(uint8_t* inBytes, size_t size)
{
uint8_t crc = 0x0; // initial value
uint8_t polynomial = 0x7;
for (size_t i = 0; i < size; i++) {
for (int bit = 7; bit >= 0; bit--) {
// get next bit
uint8_t inBit = (inBytes[i] & (1<<bit)) ? 1 : 0;
// check if MSB is set
uint8_t MSB_high = crc & 0x80;
// input Bit reinschieben
crc = (uint8_t) (crc << 1);
crc ^= inBit;
if (MSB_high) {
crc ^= polynomial;
}
// for (int in = 0; in < 8; in++) {
// printf("%d", !!((crc << in) & 0x80));
// }
// printf("\n");
}
}
return crc;
}
uint32_t crc32(uint8_t* inBytes, size_t size, uint32_t polynomial)
{
uint32_t crc = 0x0; // initial value
for (size_t i = 0; i < size; i++) {
for (int bit = 7; bit >= 0; bit--) {
// get next bit
uint8_t inBit = (inBytes[i] & (1<<bit)) ? 1 : 0;
// check if MSB is set
uint32_t MSB_high = crc & 0x80000000;
// input Bit reinschieben
crc <<= 1;
crc ^= inBit;
if (MSB_high) {
crc ^= polynomial;
}
// for (int in = 0; in < 8; in++) {
// printf("%d", !!((crc << in) & 0x80));
// }
// printf("\n");
}
// printf("0x%x\n", crc);
}
return crc;
}
int checkCrc32(uint8_t* data, size_t size, uint32_t crc, uint32_t polynomial)
{
// Daten und CRC zusammenhaengend in den HEAP Speicher kopieren
uint8_t *dataCrc = malloc(size + 4);
memcpy_s(dataCrc, size+4, data, size);
memcpy_s(dataCrc+size, 4, &crc, 4);
if (crc32(dataCrc, size+4, polynomial) == 0) return 1;
else return 0;
}