Java, int -> unsigned

Gast #1463010
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ß
#1463045
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.
Persönliche Seite #1463383
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren