Checksummenberechnung, ganz schön Tricky??



  • Nun wäre das nur noch in Code zu packen.



  • Nee irgendwie krieg ich doch nicht das korrekte Ergebnis raus.
    Hat jemand mal nachgerechnet?



  • So jetzt hab ichs aber wirklich. Thema kann gelöscht werden. 😉



  • Wenn du schon soviel plapperst, hau doch noch die Lösung hier rein für die Nachwelt 🙂



  • alles einfach XOR verknüpfen...
    😉



  • Genau, die ersten beiden Werte XOR-Verknüpfen, das Ergebnis davon mit dem nächsten Byte XOR-Verknüpfen. Das wiederholen für alle Bytes.
    Mein Problem war jedoch das das berechnete Ergebnis nicht mit der Checksumme, die mir das Programm liefert, übereinstimmt.
    Grund dafür: Die von mir berechnete Checksumme musste noch einmal negiert werden, damit sie mit der Checksumme aus dem Programmm übereinstimmt. 😉



  • Ich habe jetzt mal versucht diese Berechnung in eine Methode zu packen:
    Als Ergebnis krieg ich aber jedesmal Null returniert.

    BYTE TH200COM::BuildChecksum(BYTE HARTCOMMAND[40], int NumberOfBytes)
    {
    	int BinaryValue[40][8];
    	int ResultXOR[8];
    	//convert all bytes from hex to binary
    	for(int i=0; i<NumberOfBytes; i++)
    	{
    		int nValue=(int)HARTCOMMAND[i];
    
    		if(nValue>=128) {BinaryValue[i][7]=1; nValue-=128;} else BinaryValue[i][7]=0;
    		if(nValue>=64) {BinaryValue[i][6]=1; nValue-=64;} else BinaryValue[i][6]=0;
    		if(nValue>=32) {BinaryValue[i][5]=1; nValue-=32;} else BinaryValue[i][5]=0;
    		if(nValue>=16) {BinaryValue[i][4]=1; nValue-=16;} else BinaryValue[i][4]=0;
    		if(nValue>=8) {BinaryValue[i][3]=1; nValue-=8;} else BinaryValue[i][3]=0;
    		if(nValue>=4) {BinaryValue[i][2]=1; nValue-=4;} else BinaryValue[i][2]=0;
    		if(nValue>=2) {BinaryValue[i][1]=1; nValue-=2;} else BinaryValue[i][1]=0;
    		if(nValue>=1) {BinaryValue[i][0]=1; nValue-=1;} else BinaryValue[i][0]=0;
    	}
    
    	//XOR
    	//Initialize the first byte array
    	for(int i=0; i<8; i++){ResultXOR[i]=BinaryValue[0][i];}
    
    	//XOR the another bytes
    	for(int Byte=1; Byte<=NumberOfBytes; Byte++)
    	{
    	  for(int bits=0; bits<8; bits++)
    	  {
    		if((ResultXOR[bits]+BinaryValue[Byte][bits])==0) ResultXOR[bits]=0;
    		if((ResultXOR[bits]+BinaryValue[Byte][bits])==1) ResultXOR[bits]=1;
    		if((ResultXOR[bits]+BinaryValue[Byte][bits])==2) ResultXOR[bits]=0;
    	  }
    	}
    
    	// Negation 
    	for(int bits=0; bits<8; bits++)
    	{
    		if(ResultXOR[bits]==0) ResultXOR[bits]=1;
    		if(ResultXOR[bits]==1) ResultXOR[bits]=0;
    	}
    
    	//convert binary to hex
    	int nChecksum=0;
    	if(ResultXOR[0]==1) {nChecksum+=1;} else {nChecksum+=0;}
    	if(ResultXOR[1]==1) {nChecksum+=2;} else {nChecksum+=0;}
    	if(ResultXOR[2]==1) {nChecksum+=4;} else {nChecksum+=0;}
    	if(ResultXOR[3]==1) {nChecksum+=8;} else {nChecksum+=0;}
    	if(ResultXOR[4]==1) {nChecksum+=16;} else {nChecksum+=0;}
    	if(ResultXOR[5]==1) {nChecksum+=32;} else {nChecksum+=0;}
    	if(ResultXOR[6]==1) {nChecksum+=64;} else {nChecksum+=0;}
    	if(ResultXOR[7]==1) {nChecksum+=128;} else {nChecksum+=0;}
    
     return (BYTE)nChecksum;
    }
    

    Sieht jemand den Fehler?



  • Hab ihn!!!



  • Jetzt weis ich, woher deine 250 Beiträge kommen ! 😃



  • maRKus23 schrieb:

    Hab ihn!!!

    Stell doch mal bitte das richtige Ergebnis ins Forum. Manche Leute benutzen sowas wie die Suche 😉


Anmelden zum Antworten