Hey Leute, ich habe folgenden Java Code für eine CRC-Berechnung: public short calcCRC16(byte[] data, int length) { short polynom = (short) 0xA001; int crc = 0; // calculate CRC16 by doing a polynom division for (int i = 0; i < length; i++) { crc ^= data[i]; for(int j = 8; j > 0; j-- ) { crc = (crc >> 1) ^ (((crc & 1)==1) ? polynom : 0 ); } } return (short)crc; } leider ist das Ergebnis oftmals negativ. Jetzt gibt es in Java aber kein unsigned int. Wie kann ich dann aus einem int ein unsigned int machen? Gruß
Wie jetzt, willst Du einfach den Betrag des Ergebnisses haben? Dann mach das doch so. Java hat dafür die Methode abs(). Ah, oder Du nimmst dann halt den nächstgrößeren Datentyp, so dass Dein Ergebnis immer reinpasst und keine negative Zahl sein kann. Ein bisschen blöd ist es schon dass es kein unsigned in Java gibt, da muss ich Dir Recht geben.
Mark Brandis schrieb: > Ergebnis immer reinpasst und keine negative Zahl sein kann. Ein bisschen > blöd ist es schon dass es kein unsigned in Java gibt, da muss ich Dir > Recht geben. Nein richtig "blöd" ist an dieser stelle das casten in einen short... Int ist mit 32bit für eine 16bit CRC breit genug, und das casten auf char bringt hier eher Nachteile als Nutzen (intern wird eh mit int gerechnet weil einer der operanden integer ist und es keine explizite short arithmetik gibt...)
1 | public int calcCRC16(byte[] data, int length) { |
2 | int polynom = 0xA001; |
3 | |
4 | int crc = 0; |
5 | |
6 | // calculate CRC16 by doing a polynom division
|
7 | for (int i = 0; i < length; i++) { |
8 | crc ^= data[i]; |
9 | for(int j = 8; j > 0; j-- ) { |
10 | crc = (crc >> 1) ^ (((crc & 1)==1) ? polynom : 0 ); |
11 | }
|
12 | }
|
13 | return crc & 0xFFFF; //Für die Ängstlichen |
14 | }
|
Irgenwie kommt mir der Code doch keannt vor hatten wir den hier nicht schonmal? Diese undurchsichtige Zeile innerhalb der inneren Schleife trägt zumindest nicht zum Verständnis bei zumal es das ganze noch unnötig kompliziert macht.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.