Java, int -> unsigned

Gast #1463010
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
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
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.