Forum: PC-Programmierung Java, int -> unsigned


von Manni (Gast)


Lesenswert?

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ß

von Mark B. (markbrandis)


Lesenswert?

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.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.