# CRC16 aus Bytearray in Java



## jembo (27. Aug 2008)

Kann mir jemand bitte einen vollständigen, funktionierenden CRC16 Quellcode mit oder ohne Tabelle zeigen.
Er soll bitte das Polynom x16 + x12 + x5 + 1 verwenden und aus einem Bytearray die CRC16 Lösung in 2 Byte speichern.
Ich habe schon vieles versucht, jedoch bekomme ich immer die falschen werte aus 

Liebe Grüße
Jembo


----------



## maki (27. Aug 2008)

Google ist bei nicht kaputt 

http://www.google.co.uk/search?hl=en&q=java+CRC16&btnG=Search&meta=


----------



## Loep (27. Aug 2008)

Dann zeig doch lieber deinen Ansatz und deine erwarteten und erhaltenen Ergebnisse...


----------



## jembo (27. Aug 2008)

Das ist mein Ansatz. Was haltet Ihr davon?


 int crc = 0;
            int cData;
            int cCrc;
         byte crc16Work[] = (byte[]) crc16Value.clone();

            for (int byteCount = 0; byteCount < crc16Work.length; byteCount++)
            {
                for (int bitCount = 0; bitCount < 8; bitCount++)
                {
                    cData = (int)(crc16Work[byteCount] & 1);
                    cData= cData & 0xffff;

                    crc16Work[byteCount] = (byte)(crc16Work[byteCount] >> 1 ); 

                    cCrc = (int)(crc >> 15);
                    cCrc = cCrc & 0xffff;
                    crc = (int)((crc << 1) | cData);
                    crc = crc & 0xffff;

                    if (cCrc == 1)
                        crc ^= 0x1021;				
                }
            }

            crc= (int)(crc & 0xffff);



           crc16[0]= (byte)(crc & 0xFF); // CRC

           crc16[1]=(byte)((crc & 0xFF00) >> 8); // CRC


----------



## jembo (27. Aug 2008)

Also ich hab z.B dieses ByteArray [7E FF 03 01 08 E8 03 01 00 01 00 00 00]  und darauß sollte eigentlich 2 Bytes 
[48 60] enstehen.

Ich habe schon ein Problem beim ByteArray erstellen habe ich gemerkt. Bei zwei der folgenden Zeilen muss ich zwei Werte mit (byte) casten und erhalte somit nicht 0xFF und 0xE8 sondern 0xFFFFFFFF und 0xFFFFFFE8 wieso?
Wieso muss ich die zeilen casten und die anderen nicht?

    byte crc16Value[] = new byte[13];
    crc16Value[0]=0x7E;
    crc16Value[1]=(byte) 0xFF - (byte)0xffffff00;
    crc16Value[2]=0x03;
    crc16Value[3]=0x01;
    crc16Value[4]=0x08;
    crc16Value[5]=(byte) 0xEF;
    crc16Value[6]=0x03;
    crc16Value[7]=0x01;
    crc16Value[8]=0x00;
    crc16Value[9]=0x01;
    crc16Value[10]=0x00;
    crc16Value[11]=0x00;
    crc16Value[12]=0x00;

Bin mir sicher die crc16 funktioniert deshalb nicht!!


LG
Jembo


----------



## Marco13 (27. Aug 2008)

Wenn das vorderste Bit gesetzt ist, wird das ganze als negative Zahl interpretiert (Websuche: "Zweierkomplement Darstellung"). Je ndadem, was da rauskommen sollte, sollte es ein (byte)0xFF schon tun - ohne die Subtraktion...


----------



## jembo (27. Aug 2008)

Ich denke ich habe den Fehler mit Hilfe gefunden...

Ein Byte geht nur von -127 bis +128 also mein gewünschtes 0xFF also 255 ist zu groß


----------

