Forum: PC-Programmierung Hilfe bei C nach JAVA Portierung


von Julian W. (julian-w) Benutzerseite


Lesenswert?

Hallo,
ich würde gerne folgenden CRC-16-Algorithmus nach JAVA portieren:
1
unsigned int calcCRC16r(unsigned int crc, unsigned int c)
2
{
3
  int i;
4
5
  crc ^= c;
6
  for( i = 8; i; i-- ){
7
    crc = (crc >> 1) ^ ((crc & 1) ? 0xA5D1 : 0 );
8
  }
9
10
  return crc;
11
}

Bis jetzt bin ich soweit gekommen, jedoch habe ich ein Problem mit der 
Bedingung in der for-Schleife und dem (crc & 1) als Bedingung:
1
    public int calcCRC16r(int crc, int c)
2
    {
3
        int i;
4
5
        crc ^= c;
6
        for( i = 8; i; i-- ){
7
            crc = (crc >> 1) ^ ((crc & 1) ? 0xA5D1 : 0 );
8
        }
9
10
        return crc;
11
    }

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

MfG
Julian

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

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

1
     public int calcCRC16r(int crc, int c)
2
     {
3
         int i;
4
 
5
         crc ^= c;
6
         for( i = 8; i != 0; i-- ){
7
             crc = (crc >> 1) ^ ((crc & 1 = 1) ? 0xA5D1 : 0 );
8
         }
9
 
10
         return crc;
11
     }
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.

von D. I. (Gast)


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

von Läubi .. (laeubi) Benutzerseite


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.
1
long calcCRC16r(long crc, long c) {
2
  crc = (crc & 0xFFFFFFFF) ^ (c & 0xFFFFFFFF);
3
  for(int i = 0; i < 8; i++) {
4
    crc = crc >> 1;
5
    if (crc & 1 == 1) {
6
       crc ^= 0xA5D1;
7
    }
8
  }
9
  return crc & 0xFFFFFFFF;
10
}

von Jürgen (Gast)


Lesenswert?

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

von Julian W. (julian-w) Benutzerseite


Lesenswert?

So, hab es nun funktionierend hinbekommen:
1
    public int calcCRC16r(int crc, int c)
2
    {
3
         int i;
4
5
         crc ^= c;
6
         for( i = 8; i != 0; i-- ){
7
             if((crc & 1) == 1)
8
             {
9
                 crc = (crc >> 1) ^  0xA5D1;
10
             }
11
             else
12
             {
13
                 crc = (crc >> 1) ^  0;
14
             }
15
         }
16
17
         return crc;
18
19
    }

von Jürgen W. (lovos)


Lesenswert?

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


siehe
http://www.teialehrbuch.de/Kostenlose-Kurse/JAVA/6569-Praezedenz-der-Operatoren.html
== hat Vorrang  vor &, aber das hier nicht gewollt

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.