16bit crc checksum



  • ich würde gerne aus einem übergebenen string die 16bit prüfsumme erstellen und diese dann an den string anhängen.
    so wie ich das verstanden hab, muss ich den string in binärzahlen umwandeln und durch einen bestimmten divisor teilen. der rest ist dann die prüfsumme und wird - zurück in dezimal umgerechnet - an den string angehängt...
    soweit die theorie... aber wie setz ich das um? wie mache ich aus den zahlen eines strings eine binärzahl? durch was muss ich teilen?



  • Hi!

    ist einfacher als Du denkst! Umwandeln musste nicht in binär, brauchst nur die einzelnen Byts, der Zugriff darauf ist kinderleicht:

    char ErrorDetectCode(char block[])    //Prüfsumme berechnen
    {
    	unsigned int i;
    	int add = (int)block[0];
    	for (i = 1; i < strlen(block); i++)
    	{
    		add += (int)block[i];
    	}
    	return (char)((add & 0x00FF) ^ 0xFF);
    }
    


  • kannst du mir mal erklären was genau das programm macht? ist das alles was ich brauch?!?



  • ich hab echt riesige probleme mit diesem crc-ding... ich kapiers noch nicht so ganz und alle beispiele die ich so im netz finde sind völlig unterschiedlich... ich kann auch nicht so ganz nachvollziehen was der code genau macht...
    hier ist mal mein neuster versuch...

    unsigned short int CalcCRC16(unsigned char puchData, unsigned int uiLength) 
    {
    	unsigned char BitSchleife_uc;
    	unsigned int CRC16summe_ui;
    	unsigned int Hilf_ui;
    
    	CRC16summe_ui = 0xFFFF; 
    	while (uiLength != 0) 
    	{
    		Hilf_ui = (puchData++ << 8); 
    
    		for (BitSchleife_uc = 0; BitSchleife_uc < 8; BitSchleife_uc++) 
    		{
    			if ((CRC16summe_ui ^ Hilf_ui) & 0x8000)
    				CRC16summe_ui = (CRC16summe_ui << 1) ^ 0x1021;
    			else
    				CRC16summe_ui <<= 1;
    
    			Hilf_ui <<= 1;
    		}
    		uiLength--;
    
    	} 
    	printf("crc %d\n",CRC16summe_ui);
    	return CRC16summe_ui;
    }
    

    was meint ihr dazu?
    was genau macht denn das programm? kann ich da ein beliebiges char feld reingeben? und was kommt dann da raus? die prüfsumme als int?

    wäre euch wirklich sehr dankbar wenn da jemand helfen könnte, da ich allein echt nicht weiterkomme... danke 🙂



  • was macht dieser teil code?

    return (char)((add & 0x00FF) ^ 0xFF);
    

    alles andere ist mir klar, das charfeld wird durchgegangen, von jedem einzelnen zeichen der int-wert (also der ascii-wert) ermittelt und zusammengezählt... mir ist auch nicht so ganz klar warum zusammenzählen... aber ok...

    kann mir jemand mal diesen code erläutern?

    char ErrorDetectCode(char block[])    //Prüfsumme berechnen 
    { 
        unsigned int i; 
        int add = (int)block[0]; 
        for (i = 1; i < strlen(block); i++) 
        { 
            add += (int)block[i]; 
        } 
        return (char)((add & 0x00FF) ^ 0xFF); 
    }
    

Anmelden zum Antworten