Checksummenberechnung, ganz schön Tricky??
-
Ah jetzt ja.
-
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