www.mikrocontroller.net

Forum: PC-Programmierung Hilfe bei C nach JAVA Portierung


Autor: Julian W. (julian-w) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich würde gerne folgenden CRC-16-Algorithmus nach JAVA portieren:
unsigned int calcCRC16r(unsigned int crc, unsigned int c)
{
  int i;

  crc ^= c;
  for( i = 8; i; i-- ){
    crc = (crc >> 1) ^ ((crc & 1) ? 0xA5D1 : 0 );
  }

  return crc;
}

Bis jetzt bin ich soweit gekommen, jedoch habe ich ein Problem mit der 
Bedingung in der for-Schleife und dem (crc & 1) als Bedingung:
    public int calcCRC16r(int crc, int c)
    {
        int i;

        crc ^= c;
        for( i = 8; i; i-- ){
            crc = (crc >> 1) ^ ((crc & 1) ? 0xA5D1 : 0 );
        }

        return crc;
    }

Wie schreib ich das in JAVA um? Wäre nett, wenn ihr mir helfen könntet.

MfG
Julian

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Julian W. schrieb:
> Wie schreib ich das in JAVA um? Wäre nett, wenn ihr mir helfen könntet.
>
> MfG
> Julian

     public int calcCRC16r(int crc, int c)
     {
         int i;
 
         crc ^= c;
         for( i = 8; i != 0; i-- ){
             crc = (crc >> 1) ^ ((crc & 1 = 1) ? 0xA5D1 : 0 );
         }
 
         return crc;
     }
 
Müßte so passen.

ggf solltest du aber auf long umsteigen da int standardmäßig ein signed 
typ ist, sollte hier aber keine Relevanz haben. ggf noch den Shift nach 
rechts '>>' durch einen logischen '>>>' Shift ersetzen.

Autor: D. I. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schaut doch schonmal ganz gut aus bis auf die Tatsache das Java kein 
unsigned kennt und es da beim Shiften von negativen Werten zu Problemen 
kommen kann

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Siehe mein Hinweis am Ende, außerdem aktzeptiert java keine integer als 
boolean in der for Schleife und auch nicht im Tenärem Operator...
Wobei es mir hier auch so schent als würde nur eine 8bit CRC berechnet.

Anbei nochmal etwas übersichtlicher und 32bit unsigned kompatibel.
long calcCRC16r(long crc, long c) {
  crc = (crc & 0xFFFFFFFF) ^ (c & 0xFFFFFFFF);
  for(int i = 0; i < 8; i++) {
    crc = crc >> 1;
    if (crc & 1 == 1) {
       crc ^= 0xA5D1;
    }
  }
  return crc & 0xFFFFFFFF;
}

Autor: Jürgen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
64 bit für einen 16-Bit CRC finde ich dann doch etwas uebertrieben.

Autor: Julian W. (julian-w) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, hab es nun funktionierend hinbekommen:
    public int calcCRC16r(int crc, int c)
    {
         int i;

         crc ^= c;
         for( i = 8; i != 0; i-- ){
             if((crc & 1) == 1)
             {
                 crc = (crc >> 1) ^  0xA5D1;
             }
             else
             {
                 crc = (crc >> 1) ^  0;
             }
         }

         return crc;

    }

Autor: Jürgen W. (lovos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
statt:
             crc = (crc >> 1) ^ ((crc & 1 = 1) ? 0xA5D1 : 0 );
schreibe bitte:
             crc = (crc >> 1) ^ (( (crc & 1) == 1) ? 0xA5D1 : 0 );


siehe
http://www.teialehrbuch.de/Kostenlose-Kurse/JAVA/6...
== hat Vorrang  vor &, aber das hier nicht gewollt

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.