Problem: 8-stellige Hexadezimal ind Dezimalzahl umwandeln

LogicCube

Grünschnabel
Hey,


also ich sitze hier seit nunmehr einer woche an folgendem problem:

Ich soll ein Java Programm schreiben, dass durch Bildschirmeingabe eine 8 stellige Hexadezimalzahl einliest in ein char-Feld und dann in eine Dezimalzahl umrechnet.

Ich komme nichtmal soweit die Eingaberoutine hinzubekommen wie ich die Zahlen bzw. zeichen in das char-feld bekomme, geschweig denn dann die buchstaben (a-f) in zahlen umwandeln kann...

Vielleicht kann mich ja irgendwer auf den weg bringen, denn ich habe einfach keine idee wie ich das ganze anfangen soll....

:(
 
Servus!

Aufrufen mit:

Hex_Zahl kann zum Beispiel FFFFFFFF sein ....

java HexToInt Hex_Zahl

Code:
/*
 * Created on 14.01.2004
 *
 * To change the template for this generated file go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */

/**
 * @author Administrator
 *
 * To change the template for this generated type comment go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
public class HexToInt {
	public static void main(String[] args) {
		HexToInt hti = new HexToInt();
                                          System.out.print(""Bitte geben sie eine 8-stellige Hexadezimalzahl ein: ");

		System.out.println(hti.doIt(args[0]));
		System.out.println(hti.doIt2(args[0]));
	}

	/**
	 * 
	 */
	private long doIt(String hexStr) {
		// TODO Auto-generated method stub
		if (hexStr == null || hexStr.length() == 0 || hexStr.length() > 8) {
			System.out.println(
				"Sie haben entweder keine Zahl angegeben oder diese ist zu lang!");
			return -1l;
		}
		char[] cArray = hexStr.toCharArray();
		long value = 0l;
		int pos = cArray.length - 1;
		for (int i = pos; i >= 0; i--) {
			switch ((int) cArray[i]) {
				case (int) '0' :
					value += 0;
					break;
				case (int) '1' :
					value += (((int) '1' - (int) '0') * Math.pow(16, pos - i));
					break;
				case (int) '2' :
					value += (((int) '2' - (int) '0') * Math.pow(16, pos - i));
					break;
				case (int) '3' :
					value += (((int) '3' - (int) '0') * Math.pow(16, pos - i));
					break;
				case (int) '4' :
					value += (((int) '4' - (int) '0') * Math.pow(16, pos - i));
					break;

				case (int) '5' :
					value += (((int) '5' - (int) '0') * Math.pow(16, pos - i));
					break;
				case (int) '6' :
					value += (((int) '6' - (int) '0') * Math.pow(16, pos - i));
					break;
				case (int) '7' :
					value += (((int) '7' - (int) '0') * Math.pow(16, pos - i));
					break;
				case (int) '8' :
					value += (((int) '8' - (int) '0') * Math.pow(16, pos - i));
					break;
				case (int) '9' :
					value += (((int) '9' - (int) '0') * Math.pow(16, pos - i));
					break;

				case (int) 'A' :
					value
						+= (((10 + (int) 'A' - (int) 'A'))
							* Math.pow(16, pos - i));
					break;
				case (int) 'B' :
					value
						+= (((10 + (int) 'B' - (int) 'A'))
							* Math.pow(16, pos - i));
					break;
				case (int) 'C' :
					value
						+= (((10 + (int) 'C' - (int) 'A'))
							* Math.pow(16, pos - i));
					break;
				case (int) 'D' :
					value
						+= (((10 + (int) 'D' - (int) 'A'))
							* Math.pow(16, pos - i));
					break;
				case (int) 'E' :
					value
						+= (((10 + (int) 'E' - (int) 'A'))
							* Math.pow(16, pos - i));
					break;
				case (int) 'F' :
					value
						+= (((10 + (int) 'F' - (int) 'A'))
							* Math.pow(16, pos - i));
					break;
				default :
					{
						System.out.println("Ungültiges Zeichen: " + cArray[i]);
						return -1;
					}

			}

		}
		return value;

	}

	public long doIt2(String hexStr) {
		return Long.parseLong(hexStr, 16);
	}

}

Rückgabetyp muss long sein, da eine Hex Zahl mit 8 Stellen z.Bsp.
FFFFFFFF -> 4294967295 erzeugt was den Int überlaufen lassen würde ...

Gruß Tom
 
Zuletzt bearbeitet:
Hey,


sher geil, auf jeden Fall! Das mit den Case-Anweisungen ist auf jeden Fall eine clevere Möglichkeit alle Eingaben abzudecken;

eine frage noch: wie kann ich überprüfen ob die Eingaben auch wirklich positiv sind?

Und gibt es eine Möglichkeit, den Benutzer die Zahlen nach einer Aufforderung eingeben zu lassen?
Momentan ist es ja so, dass man den Wert direkt beim Aufruf des Programmes angeben muss. Es soll nämlich erst die Aufforderung kommen "Bitte geben sie eine 8-stellige Hexadezimalzahl ein"

Wäre super wenn das noch machbar wäre!
 
Zuletzt bearbeitet:
Servus!

Code:
public long doIt3(String hexStr) {
		String hex = "0123456789ABCDEF";

		long value = 0l;
		char[] cArray = hexStr.toCharArray();
		int pos = cArray.length - 1;

		for (int i = pos; i >= 0; i--) {
			value += (hex.indexOf(cArray[i]) * Math.pow(16, pos - i));
		}
		return value;
	}

Gruß Tom
 
Der Thread ist zwar uralt, aber vielleicht trotzdem interessant für Leute die sich hierher verirren wie ich:

Integer.parseInt( String s, int radix );
Integer.toHexString( int i );


Gruß,
PaL
 
Hallo,

wenn du dir das obige Beispiel genau anschaust wirst du sehen das diese Methode (gaaaaanz unten) im Codebeispiel auch gezeigt wird ;-)

Gruß Tom
 
Hallo,
ich habe vor Thomas Methode doIt so zu erweitern, dass sie ganze Strings mit Hex Zahlen nach String konvertiert. Mein Code bisher:
Code:
public String hexToStringWholeString(String input) {
		if (input == null)
			return null;
		String inputWithoutBlanks=this.deleteBlanks(input);
		if(inputWithoutBlanks.length()%2!=0){
			System.err.println("This string doesnt contain proper hex Strings. Note: One String char consists of two Hex chars.");
			return null;
		}
		char[] charArrayOfConvertedHex=new char[(inputWithoutBlanks.length()/2)];
		int indexOfArrayOfConvertedHex=0;
		for(int i=0;i<inputWithoutBlanks.length();i=i+2)
		{
			charArrayOfConvertedHex[indexOfArrayOfConvertedHex]=(char)this.hexToStringOneNumber(inputWithoutBlanks.substring(i, (i+1)));
			indexOfArrayOfConvertedHex++;
		}
		return new String(charArrayOfConvertedHex);
	}

hexToStringOneNumber ist hier die doIt methode von oben.
Leider bestehen die Strings alle aus ?. Was mache ich falsch?

edit: Ok hab einen Fehler gefunden weiß noch nicht ob es DER Fehler ist: Das hätte natürlich charArrayOfConvertedHex[indexOfArrayOfConvertedHex]=(char)this.hexToStringOneNumber(inputWithoutBlanks.substring(i, (i+2))); heißen müssen weil ich sonst immer nur eine der beiden Ziffern habe.

edit2: ok hab eingesehen dass man wohl nicht einfach long nach char casten kann. hab deshalb aus charArrayOfConvertedHex ein longArrayOfConvertedHex gemacht. Was ich jetzt nur noch wissen muss welche Methode kann den ascii wert aus meinen dezimalwerten errechnen?

edit3: Hat sich erledigt. konnte mein Vorhaben mit nem byteArray fortsetzen :)
 
Zuletzt bearbeitet:
Zurück