# Hexa in String



## Xerxes20 (20. Januar 2011)

Guten tag liebe Gemeinde,

ich habe mich hier angemeldet, weil ich bei Problemen immer auf diese Seite gestoßen bin und die Probleme immer gelöst wurden 

Ich habe folgendes Problem:

Ich versuche Strings, die in Hexa umgewandelt wurden, wieder in Hexa umzuwandeln.
Das klappt auch, leider nur mit einzelnen Zeichen wie 61 oder 68.

Wenn ich aber jetzt z.B. hallo (in Hexa: "68616c6c6f") auslesen möchte, gibt er ein chinesisches Zeichen aus.

Hier die Methode wo ich Hexa in Strings umwandle:


Aber ich glaube er mag irgendwie meine Umwandlung nicht:


Vielen Dank im voraus!


----------



## vfl_freak (20. Januar 2011)

Moin,

bin mir nicht ganz sicher, ob es das ist, was Du suchst, aber statt *"Long.parseLong..."* könntest Du mal 

```
long lVal = 12345;
Long.toHexString( lVal )
```
versuchen !

Gruß
Klaus


----------



## Xerxes20 (20. Januar 2011)

Hallo,

danke erstmal für die Antwort 

Ich möchte ja die Hexa aus einer Text Datei auslesen, ich weiß nicht wo ich das genau implementieren soll.

MFG


----------



## vfl_freak (20. Januar 2011)

Moin,

hä 

Ist jetzt Deine Frage, wie Du die Zeichen umwandelst oder möchtest Du wissen, wie Du (Text-)Dateien ausliest 

Gruß
Klaus


----------



## Xerxes20 (20. Januar 2011)

Hallo,

also Text Dateien kann ich auslesen, nur möchte ich dass er, wenn er die ausliest wieder in Strings umwandelt.


----------



## vfl_freak (20. Januar 2011)

Moin,

hmm, da ich aus Deinem Code aus der Start-Post nicht wirklich schlau werde, hier nochmal detailliert nachgefragt :
-  Du hast eine beliebige Textdatei, die Du auslesen willst
-  dann möchtest Du die einzelnen ausgelesenen Zeilen in Strings umwandeln und einem Texteditor anzeigen



> ```
> String h=HextoString(Long.parseLong(br.readLine(),16));
> Texteditor.textArea.setText(h);
> ```



was genau ist hier denn *br* 
was soll das *Long.parseLong* hier bewirken, wenn es doch eine Textzeile ist 

Wie genau liest Du denn die Datei ein 
Hast Du einen FileInputStream 

Gruß
Klaus


*[EDIT]*
Vlt hilft Dir sowas (ungetestet !!) :

```
byte[] bText = new byte[1000];
int iLen;
FileInputStream in = null;
File meineDatei = new File( meinDateiName );
in = new FileInputStream( meineDatei );

while( (iLen = in.read(bText) ) > 0 )
{
	String strText = new String( bText, 0, len );
	System.out.println( strText );
        System.out.println( "Gelesene Bytes : " + iLen + "  / Stringlänge : " + strText.length());
}
in.close();
```


----------



## Xerxes20 (20. Januar 2011)

Also ich baue mir gerade einen Texteditor, der die Strings beim speichern in Hexa umwandelt und wenn man die datei öffnet sollen die Hexa wieder in lesbare Strings umgewandelt werden.

Das umwandeln in Hexa habe ich schon hinbekommen. Aber das zurückumwandeln fällt mir irgendwie schwer.

br ist in dem Fall :

target = fcsave.getselectedFile();
br= BufferedReader(FileReader (target));

fcsave ist ein FileChooser

Mit br.readLine() soll er die Datei auslesen und in die TextArea schreiben.


Ich habe deinen Code ausprobiert, ausgegeben wird dabei :

68616c6c6f
Gelesene Bytes : 10  / Stringlänge : 10


----------



## vfl_freak (20. Januar 2011)

Moin,

ahh, ein BufferdReader  ;-]

Also, zuerst einmal ist Dein 

```
String h=HextoString(Long.parseLong(br.readLine(),16));
```
ziemlicher Unsinn !
Schau' Dir mal die API zu parseLong an (http://download.oracle.com/javase/6/docs/api/ und dort im Package java.lang !).
Die Funktion erwartet einen String und gibt ggf. einen Long-Wert zurück! 
Daraus mit dem "HextoString" (besser übrigens "hexToString", da Camel-case ) wieder einen String machen wollen, ist wie gesagt Blödsinn, da Dein Argument (die Rückgabe von "br.readline()") ja eh' schon ein String ist .....

Zudem liest Du mit "br.readline()" ZEILENWEISE ein (siehe ebenfalls o. g. API), musst also ggf. eine Schleife drumrum basteln 

Im Prinzip also sowas:

```
BufferedReader br;
String strLine;

br = new BufferedReader( new FileReader(meinDateiName) );

try 
{
	while( (strLine = f.readLine()) != null ) 
        {
        	strLine = strLine.trim();
                // EDIT  mache was mit diesem String ....
	}
}
```

Gruß
Klaus


----------



## Xerxes20 (20. Januar 2011)

Okay, das ist wirklich ziemlicher Unsinn 

Aber trotzdem komme ich nicht weiter


----------



## vfl_freak (20. Januar 2011)

Aha ... und ...  
um mal so kurz zu antworten wie Du :-(

Wie sieht jetzt Dein AKTUELLER Code aus ?
Hast Du meinen Vorschlag von oben wenigstens mal ausprobiert   

Gruß
Klaus


----------



## Xerxes20 (20. Januar 2011)

meinst du diesen Vorschlag?

Den habe ich ausprobiert, aber der hängt dann in der Schleife, erst wenn ich das so mache liefert er mir was:


Aber auch dann liest er nicht alles, sondern lässt die erste Zeile immer weg, deswegen nehme ich deine Version fürs auslesen der Datei:

Mir fehlt halt allerdings immernoch wie ich es umwandle.

Ich wäre sehr dankbar, wenn mir jemand sagen könnte wie, denn ich muss es bis morgen fertig haben, habe auch wirklich alles versucht


----------



## vfl_freak (20. Januar 2011)

ok, kleiner Tippfehler, der Dir aber hätte auch auffallen können 

Es muss natürlich im ersten Fall nicht heißen 

```
while( (strLine = f.readLine()) != null )
```
sondern 

```
while( (strLine = br.readLine()) != null )
```

Aber was bedeutet: "die erste Zeile wird nicht gelesen 

Was genau steht denn 
(a) in der Datei
(b) jeweils in *strLine*


Kontrolliere Das am Besten per vorher per Debugger !

Gruß
Klaus

*EDIT*
Rufst Du denn eigentlich Deine Funktion *"HextoString"* immer noch auf 
Die ist nämlich auch sehr seltsam ... scheinbar übergibst Du eine ganze Text-Zeile als long-Wert und versucht diesen Wert dann in einen String zu konvertieren ....
Das solltest Du tunlichst schon *zeichenweise* konvertieren


----------



## Xerxes20 (20. Januar 2011)

Also der Text der gespeichert wird, wird inklusive Absätze und Leerzeichen gespeichert!

Das heißt wenn ich die Datei öffne (nicht mit dem Windows Editor! sondern mit WordPad) sieht er folgendermaßen aus:

68616c6c6f
6d65696e 6e616d65 697374

Übersetzt wäre das:

hallo
mein name ist

Ich habe nämlich die Hexa "20" durch ein Leerzeichen und "da" durch ein "\n" damit man sehen kann, wie das Wort in Hexa ist.

Aber ist es nicht eignetlich egal? Dein Code funktioniert doch, dieser liest es Perfekt aus! Es muss nur noch "übersetzt2 werden.


----------



## vfl_freak (20. Januar 2011)

hmm, 

erstens ist WordPad für sowas eine ganz schlechte Idee (weil hier meist eine Formatierung hinter hängt).
Nimm' besser den Win Editor oder ein Programm wie PSPad (http://www.pspad.com/de/) ...

Liegt denn die Datei wirklich ASCII-Text vor ?
Wenn Du sie mit WordPad gespeichert hast, wird dies vermutlich nicht der Fall sein ...

Ich lese hier div. Textdateien auf die zuvor genannte Weise ohne Probleme (und vor allem ohne Konvertierungen !!) aus ....

Ggf. mußt Du halt den jede Zeile *zeichenweise* konvertieren - sprich: in einer Schleife über die Zeilenlänge laufen und jedes einzelne Byte umwandeln ...
Statt der Wrapperklasse *Long *solltest Du sinnigerweise auch besser *Character* nutzen !

Du kannst auch mal testen, ob sich wirklich nur Buchstaben in deinem Text befinden :

```
// Prüft, ob ein String nur aus Buchstaben besteht
  public boolean CheckAufBUs( String sTmp )
  {
	  for( int i = 0; i < sTmp.length( ); i++ )
	  {
		  char c = sTmp.charAt( i );
		  if( !Character.isLetter(c) ) 
		  {
			  return false;
		  }
	  }
	  return true;
  } // CheckAufBUs
```

Gruß
Klaus


----------



## Xerxes20 (20. Januar 2011)

Im Windows Editor werden ja die Absätze nicht angezeigt, deswegen öffne ich es im WordPad um zu kontrollieren ob diese auch gesetzt werden.

Der Inhalt besteht auch nicht nur aus Buchstaben, weil ich ja "20" durch " " ersetze und "da" durch "\n".


----------



## vfl_freak (20. Januar 2011)

Xerxes20 hat gesagt.:


> Der Inhalt besteht auch nicht nur aus Buchstaben, weil ich ja "20" durch " " ersetze und "da" durch "\n"



ok, "Buchstaben" war vlt. das falsche Wort ... besser: _ASCII-Zeichen_

Ich glaube, Du hast da was Falsches im Hinterkopf 

Folgendes ist identisch :
Leerzeichen   : hexadezimal 0x20 == decimal 32 == ASCII-Zeichen ' '
Buchstabe 'A' : hexadezimal 0x41 == decimal 64 == ASCII-Zeichen 'A'
Buchstabe 'x' : hexadezimal 0x78 == decimal 120 == ASCII-Zeichen 'x'
usw.

Ebenso gilt:
New Line           : hexadezimal 0x0a == decimal 10 == ASCII-Zeichen '\n '  }  beides sind nicht-darstellbare Zeichen !
Carriage Return   : hexadezimal 0x0d == decimal 13 == ASCII-Zeichen '\r'   }

Das ist alles nur eine Frage der Interpretierung !

Gruß
Klaus

*edit*
Mir fiel gerade noch ein:
Du kannst natürlich auch Deinen anfänglichen StringBuffer direkt umwandeln 

```
String meinString = sb.toString();
```

Vlt suchst Du ja dies ....


----------



## Xerxes20 (20. Januar 2011)

Also müsste ich bevor ich das Teste bzw. bvor ich das umwandle nochmal umwandeln in Hexa?


----------



## vfl_freak (20. Januar 2011)

siehe auch EDIT in meinem letzten Post ... hatte sich zeitlich überschnitten ;-)


----------



## Xerxes20 (20. Januar 2011)

Also erstmal möchte ich mich bei dir bedanken, dass du dich mit so einem schweren Fall wie mich rumschlägst 

Aber ich bin jetzt total durcheinander, denn ich weiß nicht ob meine Methode richtig ist oder falsch bzw. was ich genau ändern muss


----------



## vfl_freak (20. Januar 2011)

Kein Problem - habe gerade ein bissel Zeit ;-)

Sorry - sah zu spät, dass das mit dem StringBuilder keine gute Idee, da Du ihn nur in Deiner Konvertierung verwendest .....

Trotzdem verstehe ist nicht, warum dies hier nicht funktionieren sollte ... 
Bei mir klappt das wunderprächtig ;-)

```
BufferedReader br;
String strLine;
 
br = new BufferedReader( new FileReader(meinDateiName) );
 
try 
{
	while( (strLine = br.readLine()) != null ) 	
	{
		strLine = strLine.trim();
		Texteditor.textArea.append( strLine );
        }
} ......
```

Oder hast vlt. doch 'Murks' in der Datei (weil WordPad .....) ?

Gruß
Klaus


----------



## Xerxes20 (20. Januar 2011)

Ach ich habe das trim() vergessen und anstatt append hatte ich setText()

Jetzt funktioniert das Auslesen der Datei,

Vielen Dank bis hier hin!

Ich habe versucht eine neue Methode für das Umwandeln der Hexa wieder in String, aber es funktioniert halt noch nicht, ich weiß das da bei String e= etwas stehen müsste, dass die Hexa wieder umwandelt !

Habe es am Ende doch noch geschafft! Puh war das eine heiden Arbeit 

Ich werde hier einige Sachen löschen, damit das keiner kopiert, ich hoffe das geht in Ordnung!


----------

