Binär in Hex umwandeln

Demenkay

Mitglied
Ich muss Hexadezimal in Dezimalzahlen umwandeln und andersrum.
Den Code für Dez in Hex habe ich, jetzt dachte ich dass es wohl kein so großes Problem sein kann es andersrum auch zu schreiben, war wohl nicht so...

Java:
import java.util.Scanner;

public class Aufgabe41 {
	public static void main(String[] args) {
		int x;
		String[] hex = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A",
				"B", "C", "D", "E", "F" };
		String[] bin = { "0000", "0001", "0010", "0011", "0100", "0101",
				"0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101",
				"1110", "1111" };

		Scanner s = new Scanner(System.in);
		System.out.println("Geben Sie eine Hexadezimalzahl ein : ");
		String eingabe = s.next();
		String ergebnis= "";
		
		x = eingabe.length()%4;
		switch (x){
		
		case 0:
			eingabe = eingabe;
			break;
		case 1:
			eingabe = "000" + eingabe;
			break;
		case 2:
			eingabe = "00" + eingabe;
			break;
		case 3:
			eingabe = "0" + eingabe;
			break;
		}
		for (int i = 4; i < eingabe.length(); i= i+4) {
			char temp = eingabe.charAt(i);
			String temp2 = "" + temp + "";
			for (int j = 0; j < bin.length; j++) {
				if (temp2.equalsIgnoreCase(bin[j])) {
					ergebnis= ergebnis+ hex[j];
				}
			}
		}
		System.out.println("In binär : " + ergebnis);
	}
}

Meine erste for Schleife ist falsch, allerdings habe ich kein Ahnung wie ich es schreiben sollte. Ich habe oben mit 0en aufgefüllt, damit ich immer 4er Pakete habe zum umformen, allerdings weiß ich nicht, wie ich einen String mit 4 Zeichen in meine char temp bekommen kann!
Wäre klasse wenn jemand mit helfen könnte!
 
Zuletzt bearbeitet:

Camill

Bekanntes Mitglied
Verstehe nicht genau was durch die switch und for Konstruktion erreicht werden soll. Kennst du dich mit einer HashMap aus, darfst du so etwas benutzen?
 

Demenkay

Mitglied
Also das ist meine Umformung von hex in binär:

Java:
import java.util.Scanner;

public class Aufgabe4 {
	public static void main(String[] args) {
		String[] hex = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A",
				"B", "C", "D", "E", "F" };
		String[] bin = { "0000", "0001", "0010", "0011", "0100", "0101",
				"0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101",
				"1110", "1111" };

		Scanner s = new Scanner(System.in);
		System.out.println("Geben Sie eine Hexadezimalzahl ein : ");
		String eingabe = s.next();
		String ergebnis = "";
		for (int i = 0; i < eingabe.length(); i++) {
			char temp = eingabe.charAt(i);
			String temp2 = "" + temp + "";
			for (int j = 0; j < hex.length; j++) {
				if (temp2.equalsIgnoreCase(hex[j])) {
					ergebnis = ergebnis + bin[j];
				}
			}
		}
		System.out.println("In binär : " + ergebnis);
	}
}

Ich dachte mir jetzt ich kann die einfach umformen, damit ich von binär in hex komme! Aber ist wohl nicht der Fall...
 

Michael...

Top Contributor
Prinzipiell kann man die Wandlung von bin in hex genauso umsetzen. Man muss nur statt einzelne Zeichen zu vergleichen diesesmal immer eine Gruppe von vier Zeichen aus der Eingabe "trennen" und diese vergleichen. Falls die Länge der Eingabe nicht ein vielfaches von vier ist, kann man diese um die entsprechende Anzahl führender 0en ergänzen.
 

Demenkay

Mitglied
Ja ich habe ja im oberen Fall mit switch/case schon ergänzt, wenn die Pakete nicht aus 4 Ziffern bestehen, mein Problem ist aber nun, wie ich die 4 Pakete benutze, bzw, die Trennung hinbekomme, dass er 4 nach der erweiterung mit 0en die 4er Pakete macht...
 

Michael...

Top Contributor
Da Du charAt(int) schon kennst könntest Du Dir die Teilstrings damit zusammensetzen.
Allerdings bietet die Klasse String auch noch die Methode substring(int, int), um direkt komplette Teilabschnitte eines Strings "herauszulösen"
 

Demenkay

Mitglied
Cool, vielen Dank!! Ich hab es jetzt mit substring geschrieben und es sieht folgendermaßen aus:

Java:
import java.util.Scanner;

public class Aufgabe41 {
	public static void main(String[] args) {
		int x;
		String[] hex = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A",
				"B", "C", "D", "E", "F" };
		String[] bin = { "0000", "0001", "0010", "0011", "0100", "0101",
				"0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101",
				"1110", "1111" };

		Scanner s = new Scanner(System.in);
		System.out.println("Geben Sie eine Binärzahl ein : ");
		String eingabe = s.next();
		String ergebnis = "";
		
		x = eingabe.length()%4;
		switch (x){
		
		case 0:
			eingabe = eingabe;
			break;
		case 1:
			eingabe = "000" + eingabe;
			break;
		case 2:
			eingabe = "00" + eingabe;
			break;
		case 3:
			eingabe = "0" + eingabe;
			break;
		}
		
		
		for (int i = 4; i <= eingabe.length(); i= i+4) {
			String temp = eingabe.substring(i-4, i);
			String temp2 = "" + temp + "";
			for (int j = 0; j < bin.length; j++) {
				if (temp2.equalsIgnoreCase(bin[j])) {
					ergebnis = ergebnis + hex[j];
				}
			}
		}
		System.out.println("In hexa : " + ergebnis);
	}

}

Es funktioniert und passt auch alles. Meine Frage ist jetzt nur: Ist es wirklich richtig, wenn man die 0en VOR der binären Zahl auffüllt? Wenn ich ne 001010011 eingebe und ne 2 meine, dann füllt er ja mit 0 auf und ich bekomme 053 raus, wenn ich richtig liege, oder?
 

Michael...

Top Contributor
Ist es wirklich richtig, wenn man die 0en VOR der binären Zahl auffüllt? Wenn ich ne 001010011 eingebe und ne 2 meine, dann füllt er ja mit 0 auf und ich bekomme 053 raus, wenn ich richtig liege, oder?
Was soll daran falsch sein? Das mit "ne 2 meine" verstehe ich nicht ganz. Wenn Dich führende 0en im Ergebnis stören, kannst Du ja die Eingabe bereits auf führende 0en prüfen und die Eingabe auf die passende Länge erweitern oder verkürzen. Oder Du prüfst das Ergebnis und entfernst dort evtl. führende 0en.
Cool, vielen Dank!! Ich hab es jetzt mit substring geschrieben und es sieht folgendermaßen aus:

Das Auffüllen mit führenden 0en könnte man mit einer Schleife etwas eleganter lösen.
Die Erzeugung von
Code:
temp2
ist hier eigentlich überflüssig, da temp ja bereits ein String ist.
Java:
String temp = eingabe.substring(i-4, i);
String temp2 = "" + temp + "";
 

Neue Themen


Oben