# Binärstring in Oktalzahl umwandeln



## ChrisFreeman (23. Sep 2007)

Hallo zusammen,

ich versuche schon die ganze Zeit einen Binärstring in eine Oktalzahl umzuwandeln; Leider ohne Erfolg.
Der String besteht natürlich nur aus Nullen und Einsen...sonst wird eine Exception geworfen...

Hat jemand einen guten Tipp für mich wie ich die Umrechnung am besten hinbekomme???

Danke im Vorraus!!

Gruß chris


----------



## Beni (23. Sep 2007)

Die Klasse "Integer" bietet passende Methoden an.
- "parseInt( String s, int radix )", radix = 2 in diesem Fall,
- "toOctalString( int i )"


----------



## ChrisFreeman (23. Sep 2007)

Danke!

Ich soll die Methode zur Umwandlung nur leider selber schreiben, also keine vorhandene nehmen


----------



## maki (23. Sep 2007)

http://www.java-forum.org/de/viewtopic.php?p=322269#322269


----------



## ChrisFreeman (24. Sep 2007)

Das hilft mir leider auch nicht so reht weiter....

sollte eine recht einfache Umrechnung sein

zur Umrechnung wird der String ja in 3er Segmente aufgeteilt und dann nur addiert...

zB.    100 011 110 111 101

        421 421 421 421 421


???


----------



## function (24. Sep 2007)

die umrechnung von dual in oktal ist einfach, weil:
dual  oktal
000   0
001   1
010   2
011   3
100   4
101   5
110   6
111   7


----------



## ChrisFreeman (24. Sep 2007)

Danke, dass ist natürlich schon mal nicht schlecht.

Ich muss aber ja nun den String von hinten aus betrachten und dann in 3er schritten durchlaufen.

Mir föllt dazu noch kein Code ein, hat jamend nen Tipp wie ich dies schreiben könnte??....

Gruß Chris


----------



## ChrisFreeman (24. Sep 2007)

Der Binärstring muss ja schließlich durch 3 teilbar sein, sonst muss ich vorne noch 0en hinzufügen. Das ist das Problem...


----------



## function (25. Sep 2007)

wenn der string noch nicht geteilt ist, könnte an das so überprüfen und vervollständigen:

```
switch(str.length()%3) {
case 1:
    str = "0" + str;
    break;
case 2:
    str = "00" + str;
    break;
}
```


----------



## ChrisFreeman (25. Sep 2007)

Habe es nun versucht einzubauen, aber die Switch Anweisung macht noch Probleme :

// Umwandlung in Oktal
                for (int j = 0; j < Bin.length(); j+=3)
				{                    
                    String dreierpaar = Bin.charAt(j) + Bin.charAt(j+1) + Bin.charAt(j+2);

                    switch(dreierpaar) 
                        {
                        case 000: 
                            Ergebnis = Ergebnis + '0';
                            break;
                        case 001:
                            Ergebnis = Ergebnis + '1';
                            break;
                        case 010:
                            Ergebnis = Ergebnis + '2';
                            break;
                        case 011:
                            Ergebnis = Ergebnis + '3';
                            break;
                        case 100:
                            Ergebnis = Ergebnis + '4';
                            break;
                        case 101:
                            Ergebnis = Ergebnis + '5';
                            break;
                        case 110:
                            Ergebnis = Ergebnis + '6';
                            break;
                        case 111:
                            Ergebnis = Ergebnis + '7';
                            break;

                        }
                }       



Ich erhalte folgende Fehlermeldung:

C:\Dokumente und Einstellungen\Christian\Desktop\Info 1\test2.java:59: incompatible types

found   : int

required: java.lang.String

                    String dreierpaar = Bin.charAt(j) + Bin.charAt(j+1) + Bin.charAt(j+2);

                                                                        ^

C:\Dokumente und Einstellungen\Christian\Desktop\Info 1\test2.java:61: incompatible types

found   : java.lang.String

required: int

                    switch(dreierpaar) 

                           ^


----------



## Wildcard (25. Sep 2007)

Man kann einen String nicht 'switchen'.


----------



## SlaterB (25. Sep 2007)

chars zusammenaddiert ergeben keinen String,
wandel sie einzeln in Strings um oder mach einfach
bin.substring(x,x+3);

-------

über Strings kannst du nicht switchen,
baue entweder ein 8er-if-else,
oder parse den String zu einer Zahl (Integer.parse())
oder rechne manuell die Zahl aus


----------



## ChrisFreeman (25. Sep 2007)

Danke für die schnelle Antwort!! Hat mir schon sehr gut geholfen!!

Kann jetzt fehlerfrei compelieren....hab aber bei der Umwandlung ein Problem.

 // Umwandlung in Oktal
                for (int j = 0; j < Bin.length(); j+=3)
				{                    
*String dreierpaar = Bin.substring(j)+Bin.substring(j+1) + Bin.substring(j+2);*

                    switch(Integer.parseInt(dreierpaar)) 
                        {
                        case 000: 
                            Ergebnis = Ergebnis + "0";
                            break;
                        case 001:
                            Ergebnis = Ergebnis + '1';
                            break;
                        case 010:
                            Ergebnis = Ergebnis + '2';
                            break;
                        case 011:
                            Ergebnis = Ergebnis + '3';
                            break;
                        case 100:
                            Ergebnis = Ergebnis + '4';
                            break;
                        case 101:
                            Ergebnis = Ergebnis + '5';
                            break;
                        case 110:
                            Ergebnis = Ergebnis + '6';
                            break;
                        case 111:
                            Ergebnis = Ergebnis + '7';
                            break;

                        }
                }       

Beim Ausführen passier folgendes:

Wenn Bin=100100 ist, dann wird daraus 1001000010000100 und ich denke, dass dies an der fettgedruckten Stelle passiert. Danke schonmal im Vorraus...!![/img]


----------



## SlaterB (25. Sep 2007)

hmm, das ist jetzt aber so deutlich dass ich zumindest dir das nicht direkt verrate,
lies doch mal die API zu der Operation um zu erfahren, was die Operation überhaupt macht?!

oder lies ein Lehrbuch zu String-Operationen, das ist doch schnell überflogen,
sowas grundlegendes ohne jede Kenntnis zu benutzen..

oder teste es an einem übersichtlicheren String ABCD,
und zwar nicht gleich drei Operationen auf einmal (Bin.substring(j)+Bin.substring(j+1) + Bin.substring(j+2); )
sondern zur Eingewöhnung nur eine Operation (Bin.substring(2)

-> 
es gibt so viele Wege, sich selber schlau zu machen

-----

zu Integer.parseInt() hätte ich jetzt auch fast was gesagt, hatte da ganz anderes im Sinn,
aber könnte tatsächlich so funktionieren wie du es hast


----------



## function (25. Sep 2007)

wie wäre es denn mit bin.substring(j, j+2)?


----------



## ChrisFreeman (25. Sep 2007)

Hallo und erstmal vielen Dank für die Hilfe.. da smit dem Substring hätte ich ja eigentlich wirklich mal nachsehen können, doch raucht mir echt der Kopf. Ich brauche diese Aufgabe unbedingt bis morgen früh für eine Prüfung und ich verzweifle eben langsam. (Nein, ich werde icht Informatiker, wie man unschwer sieht. Aber leider gibt es auch für Maschbauer nunmal einen gewissen Informatik Pflichtteil) 

Also ich komme echt nicht mehr weiter... Das Programm läuft nun, ABER es macht immernoch nicht das verlante! (Ein Binärwert soll in eine Oktalzahl umgewandelt und wieder ausgegeben werden) Vielleicht ist ja jemand so nett und sagt mir die Lösung, oder gibt mir einen Tip... Hier ist der gesamte Code, so wie ich ihn habe... Ich verzweifle... 



import java.io.*;
import java.lang.*;

class Aufg2
{
		//Main
		static public void main (String[]args)throws IOException{
		BufferedReader din = new BufferedReader(new InputStreamReader (System.in));
		int Laenge;
		String Ausgabe;
		String Bin;
		do{
		System.out.println("Bitte geben sie einen String der Laenge 16 ein");
		Bin = din.readLine();
		Laenge = Bin.length();
		if (Laenge>16)
			System.out.println("Der String darf maximal 16 Zeichen beinhalten");
		}while (Laenge>16);
	    Ausgabe = bin2oct(Bin);
		System.out.println(Ausgabe);

}		

		//Methode
		static public String bin2oct (String Bin) throws IOException{

			String Ergebnis="";

            // Länge für korrekten Schleifendurchlauf festlegen
		switch(Bin.length()%3) 
                {
                case 1:
                    Bin = "0" + Bin;
                    break;
                case 2:
                    Bin = "00" + Bin;
                    break;
                }

    // Abarbeiten
  			for(int i=0; i<Bin.length(); i++)
  				{
                //Überprüfung, ob nur Binär
				char Zeich = Bin.charAt(i);
				if (Zeich!='0'&& Zeich!='1') throw new NoBinCharException("String enthaelt falsche Zeichen");

				}	

                // Umwandlung in Oktal
                for (int j = 0; j < Bin.length(); j+=3)
				{                    
                    String dreierpaar = Bin.substring(j,j+2);

                    switch(Integer.parseInt(dreierpaar)) 
                        {
                        case 000: 
                            Ergebnis = Ergebnis + "0";
                            break;
                        case 001:
                            Ergebnis = Ergebnis + '1';
                            break;
                        case 010:
                            Ergebnis = Ergebnis + '2';
                            break;
                        case 011:
                            Ergebnis = Ergebnis + '3';
                            break;
                        case 100:
                            Ergebnis = Ergebnis + '4';
                            break;
                        case 101:
                            Ergebnis = Ergebnis + '5';
                            break;
                        case 110:
                            Ergebnis = Ergebnis + '6';
                            break;
                        case 111:
                            Ergebnis = Ergebnis + '7';
                            break;

                        }
                }       

			return Ergebnis;
}	
}

class NoBinCharException extends RuntimeException{
	public NoBinCharException(){super();}
	public NoBinCharException(String meldung){super(meldung);}}


----------



## SlaterB (25. Sep 2007)

und du willst nicht näher erläutern, WAS nicht geht?
zwei Tipps:
a.) eine neue main (nur zum testen) an Stelle deiner Einlese-Katastrophe:


```
static public void main(String[] args)
        throws IOException
    {        
        String Ausgabe = bin2oct("010100");
        System.out.println(Ausgabe);
    }
```

b)
herausfinden was das Programm tut:

```
String dreierpaar = Bin.substring(j, j + 2);
            System.out.println("dreierpaar: "+dreierpaar);
```
echt schwer was?

--------

und dein switch geht doch nicht so einfach,
010 ist nicht 10 sondern 10 oktal, also 12, führende Nullen ändern den Wert,

wenn du also '010' zum int-Wert 10 castet, dann schreibe im switch an der Stelle auch nur 10


----------



## Wildcard (25. Sep 2007)

```
public class Converter {
	
	public static void main(String[] args) {
		System.out.println(convert("14"));
		
	}
	
	private static String convert(String number)
	{
		
		StringBuilder builder = new StringBuilder();
		int  i = Integer.parseInt(number,8);
		while(i>0)
		{
			builder.append(i%2);
			i/=2;
		}
		return builder.reverse().toString();
	}
}
```


----------



## ChrisFreeman (25. Sep 2007)

Entschuldige, dass DU es vielleicht besser weisst... Ich sehe ja auch, dass da einige Tips sind, nur bitte ich Dich mal um einen etwas freundlicheren Ton dabei. Nimm Dir ein Beispiel an den anderen Usern hier. Und wenn DIr das MAchwerk eines Studenten, der gezwungenemaßen Java als Pflichtfach lernen muß so aufstößt, dann sag einfach gar nichts.... Im Übrigen war diese "wie du sie nennst" Eingabekatastrophe so vergegeben.... 

Danke


----------



## SlaterB (25. Sep 2007)

wenn du nur den Ton siehst und nicht die inhaltlichen Tipps,
ja dann bist du mit den anderen wirklich besser dran,

wenn es dir dagegen um den Inhalt geht.. 

---------

@Wildcard:
Binär nach Oktal?
und wenn schon so gekürzt, dann doch gleich


```
public class Converter
{
    public static void main(String[] args)
    {
        System.out.println(convert("010111"));
    }

    private static String convert(String number)
    {
        return Integer.toOctalString(Integer.parseInt(number, 2));
    }
}
```


----------



## Wildcard (25. Sep 2007)

War's nicht Oktal nach Binär? ups...
Und die Methode ist mir natürlich bekannt, aber der OP muss anscheinend ja selbst konvertieren.


----------



## ChrisFreeman (25. Sep 2007)

Ich weiss ich weiss... aber wenn ich hier schon so eine besch.... Aufgabenstellung bekomme mir der, wie ihr selbst nennt besch.... Eingaberoutine... Dann kommt eben langsam ein wenig Frust auf... Das was ihr da schreibt, klingt alles toll.. doch verstehe ich leider nur die Hälfte... stringtooct... klingt toll, würde aber leider die Aufgabenstellung verfehlen... Ich soll es eben ohne eine fertige Methode machen..     :autsch:


----------



## Wildcard (25. Sep 2007)

```
public class Converter {
	
	public static void main(String[] args) {
		System.out.println(convert("10111"));
		
	}
	
	private static String convert(String number)
	{
		
		StringBuilder builder = new StringBuilder();
		int  i = Integer.parseInt(number,2);
		while(i>0)
		{
			builder.append(i%8);
			i/=8;
		}
		return builder.reverse().toString();
	}
}
```
 :wink:


----------



## function (25. Sep 2007)

allerding wenn ich mich recht erinnere sollte ja toOctalString durch eine eigene methode ersetzt werden.

slater das switch müßte funktionieren, weil es egal ist ob die zahl dezimal oder oktal ist, sie soll ja eigentlich nur eine dualzahl darstellen, ist zwar nicht unbedingt die korrekteste art, aber möglich.


----------



## ChrisFreeman (25. Sep 2007)

Komme nicht auf den Fehler in meiner Methode, habt ihr vl noch ein paar kleine Tipps....?


----------



## ChrisFreeman (25. Sep 2007)

Bin jetzt schon ein bisschen weiter....., jetzt geht die Umrechnung zumindest teilweise....  

110 wird richtig umgeandelt, jedoch 010 nicht......??   *grübel...


----------



## ChrisFreeman (25. Sep 2007)

Juhu, Das Programm läuft !!!!!!!!!!!!!!!!!!!!!

Alles funktioniert bestens, nur noch 2 kleine Fehler....  

Es werden in switch Case 010 und 011 nicht umgewandelt. Nur diesen beide Fälle nicht...., sonst geht alles...

Weiß vl jemand warum??

Danke schonmal im Vorraus für die ganze HIlfe hier.......


----------



## Guest (25. Sep 2007)

function hat gesagt.:
			
		

> allerding wenn ich mich recht erinnere sollte ja toOctalString durch eine eigene methode ersetzt werden.
> 
> slater das switch müßte funktionieren, weil es egal ist ob die zahl dezimal oder oktal ist, sie soll ja eigentlich nur eine dualzahl darstellen, ist zwar nicht unbedingt die korrekteste art, aber möglich.



wegen der 0 vor der zahl wird die aber als oktalzahl angesehn und 10 ist oktal eine andere Zahl als dezimal


----------



## ChrisFreeman (25. Sep 2007)

Es funktioniert ja auch 001 , nur 010 und 011 nicht????


----------



## Murray (25. Sep 2007)

ChrisFreeman hat gesagt.:
			
		

> Es funktioniert ja auch 001 , nur 010 und 011 nicht????


Weil es bei der Eins nunmal egal ist, ob man sie als Dezimal- oder als Oktal- oder auch als Binär- oder als Hexadezimaldarstellung betrachtet, der Wert bleibt gleich.


----------



## ChrisFreeman (25. Sep 2007)

und was kann ich dagegen tun?


----------



## Murray (25. Sep 2007)

Bei den Konstanten in den case-Anweisungen die führenden Nullen weglassen. An der Stelle wird ja der Integer-Wert verglichen, und dabei spielen führende Nullen ja keine Rolle (Integer.parseInt( "001") = Integer.parseInt( "1")).
Im Java-Source-Code werden int-Konstanen mit führenden Nullen aber eben als Oktaldarstellung interpretiert, ähnlich wie man durch Voranstellen von "0x" die Hexadezimaldarstellung verwenden kann. Probier es doch mal aus:


```
int i1 = 10;
int i2 = 010;
int i3 = 0x10;
System.out.println( "i1: " + i1);
System.out.println( "i2: " + i2);
System.out.println( "i3: " + i3);
```


----------



## ChrisFreeman (25. Sep 2007)

DANKE!!!!!!

Ich habes geschnallt, das Programm läuft perfekt!!!

Vielen Dank nochmal....


----------



## maki (25. Sep 2007)

http://www.ascii.cl/conversion.htm

Oktal heisst doch nur, das 8 Zustände dargestellt werden können, es handelt sich trotzdem noch um das Dualsystem, aber es sind eben nur 3 Stellen nötig um 8 verschiedene Zustände darzustellen.


```
String binärZahl= "111";

		int dezimal= (Integer.parseInt( binärZahl.substring(0,1) ) * 4) + 
					 (Integer.parseInt( binärZahl.substring(1,2) ) * 2) + 
					  Integer.parseInt( binärZahl.substring( 2, 3) );
```


----------



## Murray (25. Sep 2007)

maki hat gesagt.:
			
		

> Oktal heisst doch nur, das 8 Zustände dargestellt werden können, es handelt sich trotzdem noch um das Dualsystem, aber es sind eben nur 3 Stellen nötig um 8 verschiedene Zustände darzustellen.


 :?:  :?: 

Das Oktalsystem ist doch das Zahlensystem zur Basis 8, so dass man mit einer Stelle 8 Zustände darstellen kann (0-7). Im Dualsystem (Zahlensystem zur Basis 2) kann man mit einer Stelle nur zwei Zustände darstellen (0 und 1)


----------



## maki (25. Sep 2007)

> Das Oktalsystem ist doch das Zahlensystem zur Basis 8, so dass man mit einer Stelle 8 Zustände darstellen kann (0-7). Im Dualsystem (Zahlensystem zur Basis 2) kann man mit einer Stelle nur zwei Zustände darstellen (0 und 1)


Ja, aber die Eingabe erfolgt über das Dualsystem, es sind jeweils 3 Stellen nötig um eine Oktalzahl darzustellen

2^3 = 8


----------



## Murray (25. Sep 2007)

maki hat gesagt.:
			
		

> Ja, aber die Eingabe erfolgt über das Dualsystem, es sind jeweils 3 Stellen nötig um eine Oktalzahl darzustellen
> 2^3 = 8


Alles klar, du beziehst dich auf die ursprüngliche Aufgabe, eine Binärzahl in eine Oktalzahl umzurechnen. Klar, dann muss man immer drei Stellen zusammenfassen, um eine Stelle der Oktalzahl zu bilden (den Ansatz hatte der TE schon ziemlich schnell).


----------



## maki (25. Sep 2007)

Ich hatte deinen Post und den letzten vom TE verpasst..


----------



## SlaterB (25. Sep 2007)

dass mit Oktal 010 hatte ich doch auch schon ausführlich erklärt und die Lösung genannt,
mehr lesen bitte


----------



## Murray (26. Sep 2007)

SlaterB hat gesagt.:
			
		

> dass mit Oktal 010 hatte ich doch auch schon ausführlich erklärt und die Lösung genannt,
> mehr lesen bitte



Das habe ich wohl gesehen, aber ChrisFreeman hat wesentlich später geschrieben


> 110 wird richtig umgeandelt, jedoch 010 nicht......?? *grübel...


was mich zu der Ansicht brachte, dass die erste Erklärung wohl irgendwie nicht durchgedrungen war.


----------



## SlaterB (26. Sep 2007)

klar, ich meinte das an ChrisFreeman


----------



## ChrisFreeman (26. Sep 2007)

Habe ich wirklich nicht mitbekommen.....

Bin aber froh, dass mein Programm jetzt läuft, wenns auch sicherlich nicht die schönste Lösung ist :wink:


----------

