www.mikrocontroller.net

Forum: PC-Programmierung Java, int -> unsigned


Autor: Manni (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...)
public int calcCRC16(byte[] data, int length) {
  int polynom = 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 crc & 0xFFFF; //Für die Ängstlichen
  }
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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.