Java :: Aufgabe #116 :: Lösung #1
2 Lösungen

#116
Base64 - Kodierung/-Dekodierung
Fortgeschrittener - Java
von devnull
- 14.03.2016 um 14:42 Uhr
Base64 ist ein Verfahren zur Kodierung von 8-Bit-Binärdaten und wird häufig zum Kodieren von Email-Anhängen verwendet.
Schreibe wahlweise einen Base64-Encoder oder einen Base64-Decoder. Wer Lust hat, kann natürlich auch beide Funktionen in einem Programm kombinieren.
Schreibe wahlweise einen Base64-Encoder oder einen Base64-Decoder. Wer Lust hat, kann natürlich auch beide Funktionen in einem Programm kombinieren.
#1

von LittleFistah (240 Punkte)
- 18.03.2016 um 11:25 Uhr
Hier meine Lösung.
Beim Decoden hätte man das Auflösen der tatsächlichen Stellen die ausgegeben werden schöner lösen können aber naja...
Und ja die ArrayLists am Anfang sind schön :)
MAIN:
Java-Code
SechsBit:
Java-Code
AchtBit:
Java-Code
Kodierer:
Java-Code
Beim Decoden hätte man das Auflösen der tatsächlichen Stellen die ausgegeben werden schöner lösen können aber naja...
Und ja die ArrayLists am Anfang sind schön :)
MAIN:

package de.littlef; import java.util.ArrayList; import java.util.Scanner; public class Base64 { private static Scanner sc = new Scanner(System.in); private static Kodierer kodierer = new Kodierer(); private static String sInput; private static String sOutput; private static int iAnzahlBytes; private static int iFuell; private static ArrayList<AchtBit> liAchtBit = new ArrayList<AchtBit>(); private static final String sFuell = "00000000"; public static void main(String[] args) { // Input: System.out.println("Bitte geben Sie Ihre zu verschlüsselnde Bytes ein:"); sInput = sc.nextLine(); sc.close(); // Anzahl der Bytes ausrechnen: iAnzahlBytes = sInput.length() / 8; // Eventuell FüllBytes anheften: if (iAnzahlBytes % 3 == 1) { sInput += sFuell; sInput += sFuell; iFuell = 2; } else if (iAnzahlBytes % 3 == 2) { sInput += sFuell; iFuell = 1; } else { iFuell = 0; } // Input in AchtBit Liste übertragen: for (int i = 0; i < sInput.length(); i += 8) { AchtBit temp = new AchtBit(sInput.substring(i, i + 8)); liAchtBit.add(temp); } for (int i = 0; i < liAchtBit.size(); i++) { } // Kodieren lassen: sOutput = kodierer.encode(liAchtBit,iFuell); // Kodiert ausgeben: System.out.println("Kodierter Text:\n" + sOutput); // Dekodieren lassen: System.out.println("Dekodierter Text:\n"+kodierer.decode(sOutput,iAnzahlBytes)); } }
SechsBit:

package de.littlef; public class SechsBit { private String sSechsBit; public SechsBit(String x){ setSechsBit(x); } private void setSechsBit(String x){ sSechsBit = x; } public String getSechsBit(){ return sSechsBit; } }
AchtBit:

package de.littlef; public class AchtBit { private String sAchtBit; public AchtBit(String x){ setAchtBit(x); } private void setAchtBit(String x){ sAchtBit = x; } public String getAchtBit(){ return sAchtBit; } }
Kodierer:

package de.littlef; import java.util.ArrayList; public class Kodierer { @SuppressWarnings("serial") private static final ArrayList<String> codeSechsBit = new ArrayList<String>() { { // 32-16-8-4-2-1 add("111111"); add("111110"); add("111101"); add("111100"); add("111011"); add("111010"); add("111001"); add("111000"); add("110111"); add("110110"); add("110101"); add("110100"); add("110011"); add("110010"); add("110001"); add("110000"); add("101111"); add("101110"); add("101101"); add("101100"); add("101011"); add("101010"); add("101001"); add("101000"); add("100111"); add("100110"); add("100101"); add("100100"); add("100011"); add("100010"); add("100001"); add("100000"); add("011111"); add("011110"); add("011101"); add("011100"); add("011011"); add("011010"); add("011001"); add("011000"); add("010111"); add("010110"); add("010101"); add("010100"); add("010011"); add("010010"); add("010001"); add("010000"); add("001111"); add("001110"); add("001101"); add("001100"); add("001011"); add("001010"); add("001001"); add("001000"); add("000111"); add("000110"); add("000101"); add("000100"); add("000011"); add("000010"); add("000001"); add("000000"); } }; @SuppressWarnings("serial") private static final ArrayList<String> codeZeichen = new ArrayList<String>() { { add("/"); add("+"); add("9"); add("8"); add("7"); add("6"); add("5"); add("4"); add("3"); add("2"); add("1"); add("0"); add("z"); add("y"); add("x"); add("w"); add("v"); add("u"); add("t"); add("s"); add("r"); add("q"); add("p"); add("o"); add("n"); add("m"); add("l"); add("k"); add("j"); add("i"); add("h"); add("g"); add("f"); add("e"); add("d"); add("c"); add("b"); add("a"); add("Z"); add("Y"); add("X"); add("W"); add("V"); add("U"); add("T"); add("S"); add("R"); add("Q"); add("P"); add("O"); add("N"); add("M"); add("L"); add("K"); add("J"); add("I"); add("H"); add("G"); add("F"); add("E"); add("D"); add("C"); add("B"); add("A"); } }; private ArrayList<String> liSechsBit = new ArrayList<String>(); private String s24Bit; private String encoded; private String decoded; private int iFuell; // Kodieren public String encode(ArrayList<AchtBit> toEncode, int iF) { iFuell = iF; encoded = ""; // 24Bit Sequenz erstellen for (int i = 0; i < toEncode.size(); i += 3) { s24Bit = ""; for (int j = 0; j < 3; j++) { s24Bit += toEncode.get(i + j).getAchtBit(); } // 24Bit Sequenz in 6Bit Sequenzen splitten for (int j = 0; j < s24Bit.length(); j += 6) { liSechsBit.add(s24Bit.substring(j, j + 6)); } } // liSechsBit Liste durchgehen und einzelne 6-Bit verschlüsseln for (int i = 0; i < liSechsBit.size()-iFuell; i++) { for (int j = 0; j < codeSechsBit.size(); j++) { if (liSechsBit.get(i).equals(codeSechsBit.get(j))) { encoded += codeZeichen.get(j); } } } //Fuellbytes mit = ersetzen for (int i = 1; i <= iFuell; i++) { encoded += "="; } return encoded; } //Dekodieren public String decode(String encoded, int iSendBytes){ decoded=""; //Alle Stellen durchgehen und zuordnen ( =Fällt automatisch raus) for (int i = 0; i < encoded.length(); i++) { for (int j = 0; j < codeZeichen.size(); j++) { if(encoded.substring(i,i+1).equals(codeZeichen.get(j))){ decoded += codeSechsBit.get(j); } } } return decoded.substring(0, 8*iSendBytes); } }
Kommentare:
Für diese Lösung gibt es noch keinen Kommentar
Seite 1 von 0
1