Byte Array multiplizieren

marco420

Mitglied
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(...)
Diese Methode berechnet die Prüfziffe. Die 12 Ziffern der EAN werden als Byte-Array an die Methode übergeben. Die berechnete Prüfziffer wird an den Aufrufer der Methode zurückgegeben.
Hinweis: Die ersten 12 Ziffern der EAN Nummer werden als Byte-Array übergeben. Die ermittelte Prüfziffer ist der Rückgabewert der Methode.

parseEan(...)
Diese Methode wandelt einen 12-stelligen EAN-String in ein Byte-Array um. Der EAN-String wird der Methode als Parameter übergebe. Die Methode wandelt jedes einzelne Zeichen des EAN-Strings in eine Zahl von Type Byte um. Die so umgewandelten Zahlen werden in ein Array gespeichert und dann an den Aufrufer der Methode zurückgegeben.

Hier der bisherige Java-Code (noch nicht vollständig aber es hapert ja momentan schon am compilieren :bahnhof:)
Java:
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

Top Contributor
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

Bekanntes Mitglied
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

Mitglied
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

Bekanntes Mitglied
Java:
byte meineVar = (byte) 3 ;
bzw.
Java:
byte meineVar ;
int iWert = 3 ;
meineVar = (byte) iWert;

Nennt sich Typecast.
 

Thallius

Top Contributor
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

Mitglied
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

Java:
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);

    }*/
}
 
Zuletzt bearbeitet:

Neue Themen


Oben