Datum:
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
Datum:
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.
Datum:
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
Datum:
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; } |
Datum:
64 bit für einen 16-Bit CRC finde ich dann doch etwas uebertrieben.
Datum:
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;
}
|
Datum:
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