#include <print>
#include <ctime>
#include <cstdlib>

// Funktion zu Berechnung der Pruefsumme eines Datenfeldes
// data: Zeiger auf Datenfeld
// size: Groesse des Datenfeldes in Bytes
auto Checksum(unsigned char* data, int size)
{
    // Alle Elemente im Feld Exclusive-OR
//    unsigned char cs = static_cast<unsigned long>(data[0]);
    unsigned char cs = data[0];
    for (auto index = 1; index < size; index++)
        cs ^= data[index];
    // Pruefsumme zurueckgeben
    return cs;
}

// Funktion zur Datenpruefung in einen Datenfeld
// data: Zeiger auf Datenfeld
// size: Groesse des Datenfeldes in Bytes
// cs: Soll-Pruefsumme des Datenfeldes
bool CheckData(unsigned char* data, int size, unsigned char cs)
{
    // Alle Elemente im Feld Exclusive-OR
    unsigned char csCalc = data[0];
    for (auto index = 1; index < size; index++)
        csCalc ^= data[index];
    // Vergleich mit uebergebener Pruefsumme zurueckgeben
    return (cs == csCalc);
}

// Feldgroesse
constexpr int SIZE = 10;

// main Funktion
int main()
{
    // Feld anlegen
    unsigned char array[10];

    // Zufallszahlengenerator initiailisieren
    auto actTime = std::time(nullptr);
    std::srand(actTime);
    // Feld mit Zufallszahlen fuellen
    for (auto index = 0; index < SIZE; index++)
        array[index] = static_cast<unsigned char>(rand() & 0xFF);

    // Pruefsumme berechnen
    auto cs = Checksum(array, SIZE);
    // Daten ueberpruefen
    if (CheckData(array, SIZE, cs) == true)
        std::println("Daten sind in Ordnung.");
    else
        std::println("Daten sind fehlerhaft!");

    // Daten 'verfaelschen'
    array[0] = ~array[4];
    // Daten erneut ueberpruefen
    if (CheckData(array, SIZE, cs) == true)
        std::println("Daten sind in Ordnung.");
    else
        std::println("Daten sind fehlerhaft!");
}
