# Byte Array multiplizieren



## marco420 (7. Okt 2014)

Hallo Community, ich lerne derzeit Fachinformatiker für Systemintegration. In der Berufsschule haben nur nun die Aufgabe bekommen einen "EAN-Scanner" zu programmieren. Folgendes soll verwendet werden, eine Klasse "EAN" und in der Klasse die Methoden "calcPruefziffer (ean12[] :byte):byte"  und "praseEan (ean12 : String):byte". (Noch keine Main Methode vorhanden)

Aufgabenstellung des Lehrers:


> Berechnung der Prüfziffer:
> Die zwölf Ziffern der Artikelnummer werden von links nach rechts addiert. Vor der Addition werden die Ziffern an den geraden Stellen mit 3 multipliziert. Die Summer wird durch 10 dividiert. Der Rest wird als ganze Zahl von 10 subtrahiert. Die Einerstelle der Differenz ist die Prüfziffer.
> 
> calcPruefziffer(...)
> ...



Hier der bisherige Java-Code (noch nicht vollständig aber es hapert ja momentan schon am compilieren :bahnhof

```
public class EAN {
    public byte calcPruefziffer (byte ean12[]){        
        ean12 = new byte[12]; 
        int sum; 
            for (int i = 0; i < 12; i++)
            //Vor der Addition werden die Ziffern an den geraden Indexstellen mit 3 multipliziert
            {
                if (ean12[i] % 2 == 0){
                    ean12[i] = (ean12[i]*3);
                }
            }
        
        //Addition     
        sum = ean12[0] + ean12[1] + ean12[2] + ean12[3] + ean12[4] + ean12[5] + ean12[6] +
        ean12[7] + ean12[8] + ean12[9] + ean12[10] + ean12[11];
        
        //Die Summe wird durch 10 dividiert
        sum = sum / 10;
        
        //Der Rest wird als ganze Zahl von 10 subrahiert.
        sum = 10 - sum;
        
        //Einerstelle aus der Variable extrahieren
        sum = sum % 10;
        
        
    }
    public byte parseEan(String ean12) {
        
    }
}
```

Ich erwarte hier nun keinesfalls dass meine Hausaufgaben von den anderen erledigt werden. Ich will nur lediglich wissen, warum ich das Byte Array nicht mit 3 multiplizieren kann. Ich wäre sehr froh, wenn mir hierbei jemand helfen könnte.


----------



## Thallius (7. Okt 2014)

Was mir auf die schnelle auffällt:

Warum deklarierst du ean12 noc einmal neu obwohl du es als parameter übergeben wird?
Warum addierst du die 12 Werte icht direkt in der Schleife?
Warum gibst du das Ergebnis nicht zurück?

Gruss

Claus


----------



## arilou (8. Okt 2014)

Außerdem deklariert man in Java Arrays nicht "C-mäßig" (also
FALSCH:   byte meinArray[] ;
RICHTIG:  byte[]  meinArray ;
).

Zusammen mit Thallius' Kommentar sollte das schon zu was kompilierbarem führen.


----------



## marco420 (8. Okt 2014)

Hallo, danke erstmal für die Antworten. Ich habe nun alles befolgt und den Code dementsprechend verändert. Leider wirft mit der Compiler immer noch einen Fehler beim multiplizieren des Arrays mit 3. 

Folgender Fehler erscheint:


> incompatible types: possible lossy conversation from int to byte



Ich verstehe das nicht, da die Zahl 3 noch lange nicht so groß ist wie der Wertebereich von Integer. wenn ich eine byte Vaiable "multiplikator" anlege und ihr den Wert 3 zuweise, kommt genau der selbe Fehler. Wie komme ich hier weiter?


----------



## arilou (8. Okt 2014)

```
byte meineVar = (byte) 3 ;
```
bzw.

```
byte meineVar ;
int iWert = 3 ;
meineVar = (byte) iWert;
```

Nennt sich Typecast.


----------



## Thallius (8. Okt 2014)

Da Du uns den neuen Code nicht zeigst können wir wieder nur raten aber ich denke mal du berechnest die checksum in

int sum

und machst dann ein 

return sum;

Damit gibst du ein int zurück wo ein byte erwartet wird. Der Compiler kann nicht wissen was wirklich in dem int drin steht. Also geht er vom größtmöglichen Wert aus und der passt eben nicht in ein byte.
Wenn Du Dir aber sicher bist, dass der Wert von sum niemals größer als 127 werden kann (und nur dann) dann kannst du den Wert einfach auf byte casten

return (byte)sum;

Gruß

Claus


----------



## marco420 (8. Okt 2014)

Danke vielmals das Problem wurde damit behoben  

Nun habe ich aber ein weiteres Problem. Wenn ich versuche in der Methode "parsingEan()" versuche das Array zurückzugeben, wirft er mit einen '.class' expected Fehler. Hier mal der Code


```
import java.util.Scanner;
public class EAN {
    public byte calcPruefziffer(byte[] ean12) {
        byte sum = 0;

        for (byte i=0;i < 12;i++) {
            if (i % 2 ==0) {
                ean12[i] = (byte) (ean12[i]*3);
            }

            //Addition
            sum = (byte) (sum + ean12[i]);
        }

        //Die Summe wird duch 10 dividiert aber der Rest soll bleiben
        sum = (byte) (sum % 10);
        //Der Rest wird als ganze Zahl von 10 subtrahiert
        sum = (byte) (10 - sum);
        //Einerstelle extrahieren
        sum = (byte) (sum % 10);

        System.out.println(sum);

        return sum;
    }

    public byte[] parseEan(String ean12) {
        String aZ; //aktuelleZeile
        //Test String String ean12="012345678912"; {0,1,2,3,4,5,6,7,8,9,1,2}
        short zähler1=0;
        short zähler2=1;
        byte zahl;
        byte[] array = new byte[12];
        //byte[] ean12 = new byte[12];
        for (byte i=0;i<12;i++) {
            aZ = ean12.substring(zähler1, zähler2);
            zahl = Byte.parseByte(aZ);
            zähler1++;
            zähler2++;
            array[i] = zahl;
        }

        return array[];
    }

    public void testCalcPruefziffer() {
        byte[] testEan = new byte[] {0,1,2,3,4,5,6,7,8,9,6,4,4};
        calcPruefziffer(testEan);
    }
    /*public void main(String []args) {
    System.out.println("Geben Sie die ersten 12 Stellen Ihres 13 Stelliges EAN-Codes ein!:");
    System.out.print("EAN-Code: ");
    Scanner scan = new Scanner(System.in);
    String ean12;
    ean12 = scan.next();
    parseEan(ean12);

    }*/
}
```


----------



## marco420 (8. Okt 2014)

Habs schon danke.


----------

