# String und HEX-Werte ersetzen



## heidiweber (4. Jan 2008)

Hallo

ich lese aus einer Datei Datensätze. Im Datensatz kann der HEX-Wert 00 vorkommen. Jetzt möchte ich diesen HEX-Wert mit HEX 32 (= Leerzeichen) ersetzen. 
So lese ich ein:


```
br = new BufferedReader(new InputStreamReader(new FileInputStream(eingabeDat), "ISO-8859-1"));

while ((sReadDs = br.readLine()) != null) {
 //ersetze in sReadDs alle HEX00 durch HEX32
 //dies habe ich bereits probiert: sReadDs.replace((char)0, ' ');  --> Funktioniert leider nicht
}
```

Wie kann man dies am einfachsten realisieren?

Grüße
Heidi


----------



## SlaterB (4. Jan 2008)

was ist denn überhaupt in der Datei, genauer: im String sReadDs?
chars wie 0 und ' ' oder doch eher normale Zahlen wie "00" und "32"?


----------



## heidiweber (4. Jan 2008)

Im String sReadDs sind ganz normale ASCII-Zeichen - Buchstaben, Zahlen und Leerzeichen. Ein ganz normlaer Datensatz. Wenn ich mir die Datei aber in Ultraedit im HEX-Modus anschaue, so kann es vorkommen, dass da kein Leerzeichen (HEX32) sondern eben HEX00 steht. Diese Datei kommt per FTP von einem IBM-Host. 

Jetzt möchte ich eben das HEX00 in HEX32 umwandeln.


----------



## SlaterB (4. Jan 2008)

...

erstelle dir eine Datei mit einem Hex00 an erster Position oder merke dir, wo in einer vorhandenen Datei Hex00 auftaucht,
dann lies die Datei in Java ein und schaue nach, was an der Stelle im Java-String steht (anscheinend ja nicht char 0),
ersetze diesen char/ substring durch ' ' und fertig


----------



## heidiweber (4. Jan 2008)

so einfach ist das leider nicht oder ich schnalls einfach nicht.

wenn ich das so probiere:

System.out.println("vorher" + sReadDs);
//dann kommt als Ausgabe: vorher und noch ein kleines viereckiges Kästchen (eben das HEX00)

sReadDs.replace((char)0, ' ');

System.out.println("nachher" + sReadDs);
//dann kommt als Ausgabe: nachher und noch ein kleines viereckiges Kästchen (eben das HEX00)



Probiere ich das so:

char[] a = sReadDs.toCharArray();

for (int i = 0; i < a.length; i++) {
  if (a_ == (char)0) {
    a = (char)32;
    //habe auch das probiert: a = ' '; --> kommt dann das selbe
    System.out.println("drinnen" + a);
    // hier schaut gut aus --> wird zumindest nichts angezeigt
  }
}

sReadDs = a.toString();

System.out.println("nachher" + sReadDs);

Dann kommt als Ausgabe:
nachher[C@1df5a8f


So schaut die Eingabedatei normal aus:

ab de

Und so in Ultraedit im HEX-Modus:
61 62 00 64 65

Ich schnalls einfach nicht...._


----------



## SlaterB (4. Jan 2008)

> sReadDs = a.toString(); 

-> sReadDs = new String(a); 

sonst bekommst du nur die Beschreibung des Arrays:
"[C" für char-Array +@+ der HashCode,

----------

> if (a_ == (char)0) { 
>   a = (char)32; 
> }
bewirkt doch letzlich das gleiche wie sReadDs.replace((char)0, ' ');,
warum machst du das nochmal einzeln im char-Array?

offensichtlich ist der gesuchte char nicht 0, deswegen habe ich dir doch vorgeschlagen, erstmal zu SCHAUEN, welcher char es ist,
durchlaufe z.B. das char-Array und gib zu jedem char den int-Wert aus:


for (int i = 0; i < a.length; i++) { 
System.out.println("i: "+i+": "+((int) a));
}_


----------



## heidiweber (4. Jan 2008)

erschlagt mich bitte...

man sollte es auch so machen.
sReadDs = sReadDs.replace((char)0, ' '); 

AHHHHH)


----------



## SlaterB (4. Jan 2008)

ach ja, dieser nette Fehler,
nun dann hat deine manuelle Ersetzung
> if (a_ == (char)0) { 
> a = (char)32; 
> }
doch auch weitergeholfen,  hätte ich nicht gedacht_


----------



## heidiweber (4. Jan 2008)

ja schon - aber dann hatte ich ja noch diesen Fehler:

sReadDs = a.toString(); 

System.out.println("nachher" + sReadDs); 

Dann kommt als Ausgabe: 
nachher[C@1df5a8f 

Lange lange Geschichte)) Wenns nicht läuft, dann läufts ebene nicht


----------

