Checksumme in C++

Status
Nicht offen für weitere Antworten.

foobar

Top Contributor
Hi,

kann mir jemand sagen wie ich folgenden C++ Code in Java umsetze:

Code:
char CalcCRC(unsigned char *tgram)
{
	unsigned char CRC=0;

	for(int i=0;i<4*8;i++)
    // IF bit i in telegram XOR bit to shift out
    if(((tgram[i>>3]>>(i&7))^CRC)&1)
        CRC=(CRC>>1)^0xCF;
    else
        CRC>>=1;

return CRC;

}

Die Methode berechnet die Checksumme eines char[] mit 4 Elementen. Irgendwie werden alle Bits verxord aber ich schnall es nicht ganz.
 

thE_29

Top Contributor
Code:
  private void testForFooBar()
  {
    char tgram[] = "FFFF".toCharArray();
    char CRC = 0;
    for(int i=0;i < 4*8;i++)
    {
      if( ( ( (tgram[i >> 3] >> (i & 7) ) ^ CRC ) & 1 ) != 0)
      {
        CRC = (char) ( (CRC >> 1) ^ 0xCF);
      }
      else
      {
        CRC >>= 1;
      }
    }    
    System.out.println(">> " + (byte)CRC);
  }

Bei C/C++ ist bei einem if ohne Abfrage auf == oder != immer auf != 0 == true.

Habs jetzt mit 4 verschiedenen Strings probiert und es kam bei beiden (C Programm vs Java) das gleiche raus.
 

foobar

Top Contributor
@the_29 Danke für deinen Beitrag.

Ja, auf die Idee bin ich dann auch gekommen. Trotzdem verstehe ich den Code nicht wirklich.
 
G

Guest

Gast
foobar hat gesagt.:
@the_29 Danke für deinen Beitrag.

Ja, auf die Idee bin ich dann auch gekommen. Trotzdem verstehe ich den Code nicht wirklich.
Was verstehst du am Code nicht? Stell doch bitte eine genauere Frage.
 

thE_29

Top Contributor
Er geht einfach jedes Zeichen 4 mal durch ;)
Und macht via verschieben und xor eine Checksumme (wenn gleich eine ziemlich Dumme :bae:)
 

Siassei

Bekanntes Mitglied
Servus,

gleich mal ne simple Frage zur Begrüßung ;) Ist bei deinem Codebeispiel die Länge von char auf 8 bits festgelegt?

Falls ja, darfst du weiter lesen :) Ansonsten musst du dir halt nen Datentyp für die jeweilige Größe suchen. Falls du auf Performance aus bist, solltest du byte -> int wechseln. Dieser belegt zwar mehr Speicher im RAM, aber die Funktion ist deutlich schneller. Zu mindestens im Nanobereich, solange arg.length < XXXX ;)

Das Beispiel ist hier entstanden und ich gebe keine Garantie ;)

Code:
private byte calcCRC(byte[] arg)
  {
    byte CRC = 0;
    for(int i=0;i < arg.length * 8;i++)
    {
      if( ( ( (arg[i >> 3] >> (i & 7) ) ^ CRC ) & 1 ) != 0)
      {
        CRC =  (CRC >> 1) ^ 0xCF;
      }
      else
      {
        CRC >>= 1;
      }
    }  
  }

Falls du 4*8 verwenden möchtest, dann rechne das doch im Kopf aus und schreibe das Ergebnis anstelle der Formel. Diese kannst du ja in einem Kommentar dokumentieren.
 

Siassei

Bekanntes Mitglied
Servus,

zufällig benötige ich den CRC-32 selbst für einen Fall und habe daher mir eine kleine Klasse gebastelt. Der Code basiert vollständig auf den Wiki-Artikel. Falls Fehler vorhanden sind oder der Code zusätzlich optimiert werden könnte bitte ich um eine Beitrag von euch :)

Wiki: http://de.wikipedia.org/wiki/Zyklische_Redundanzprüfung
http://www.informatik.uni-frankfurt.de/~haase/crc.html

Code:
public final class CRC {
    
    /// -----------------------------------------------------------------------
    ///
    ///     Constant
    ///
    /// -----------------------------------------------------------------------
    
    
    public static final int CRC32POLYNOM = 0x04C11DB7;
    public static final int CRC32POLYNOM_REV = 0xEDB88320;


    /// -----------------------------------------------------------------------
    ///
    ///     Methoden
    ///
    /// -----------------------------------------------------------------------
    
    /**
     * Berechnet den CRC-32.
     * 
     * @param in
     * @return
     */
    public static final int calc32(final int[] in) {
	int res = 0;
	
	for(int i=0; i<in.length; i++) {
	    if((((res & 0x80000000) != 0) ? 1 : 0) != in[i])
		res = (res << 1) ^ CRC32POLYNOM;
	    else
		res <<= 1;
	}
	
	return res;
    }
    
    /**
     * Berechnet den modifizierten CRC-32. Standarts wie Ethernet modifizieren
     * den Algorithmus.
     * 
     * @param in
     * @return
     */
    public static final int calc32Modif(final int[] in) {
	int res = 0xFFFFFFFF;
	
	for(int i=0; i<in.length; i++) {
	    if((res & 1) != in[i])
		res = (res >>> 1) ^ CRC32POLYNOM_REV;
	    else
		res >>>= 1;
	}
	
	return res;
    }
}
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben