2016-04-12 14 views
1

Ich habe eine Textdatei, die das Wort "cool" enthält. Ich lese alle Bytes in dieser Datei und verwandle sie in eine Zeichenfolge. In einer anderen Funktion, in der ich versuche, die gleiche Zeichenkette wieder in Bytes umzuwandeln, um in die Datei zu schreiben, bekomme ich nicht, was ich erwartet habe.Wie konvertiert man die Zeichenkette zurück in Bytes, um in eine Datei in Java zu schreiben?

Path path = Paths.get(fileName); 
byte[] data = Files.readAllBytes(path); 

String x = new String(); 
for(byte b: data){ 
    x += Byte.toString(b); 
} 
System.out.println(x); 

Ausgang: "cool" verwandelte sich in Bytes

99111111108 

Leider unterhalb der Code schreibt nicht "cool" zurück in die Datei, sondern es schreibt 99111111108.

str = "99111111108"; 
FileOutputStream C = new FileOutputStream("new.txt"); 
C.write(str.getBytes()); 
C.close(); 
+0

Was ist, wenn Sie die Zeichenfolge wie folgt erstellen: 'String x = new String (Daten," UTF-8 ");' ... verhält sich der Rest Ihres Programms dann wie Sie wollen? – dnault

+0

Nein, gibt es eine andere Möglichkeit, die Zeichenfolge zurück in andere Bytes als getBytes() zu konvertieren? – Lui

+1

@Lui - Sie können, aber "99111111108" ist nicht Ihre Zeichenfolge - es ist eine Zeichenfolge aus Bytes als Dezimalzahlen dargestellt. kühl -> [99] [111] [111] [108]. Sie müssen "cool" zurück in Bytes, nicht "99111111108" – xpcoffee

Antwort

1

Check out: https://docs.oracle.com/javase/7/docs/api/java/lang/Byte.html#toString(byte)

toString

public static String toString (byte b)

Gibt ein neues String-Objekt das angegebene Byte repräsentiert. Die Radix wird angenommen, 10.

Parameter sein: b - das Byte konvertiert werden Returns: der String Darstellung des angegebenen Byte

Siehe auch: Integer.toString (int)

Das Problem ist, dass Sie die Zeichenfolge in Bytes verwandeln, aber dann gehen Sie und drehen dieses Byte in eine Zeichenfolge/ein Zeichen (interpretiert als eine Basis 10 Nummer - Radix = 10) was bedeutet, dass Sie im Wesentlichen die ASCII-Entsprechung erhalten von jedem Zeichen (c = 99, o = 111, o = 111, l = 108), die eine Zahl in der Basis 10 ist. Wie auch immer du bist numerisches Zeichen für jede Ziffer. Wenn Sie die Zeichenfolge zurück in ein Byte drehen, erhalten Sie das Byte für das numerische Zeichen nicht das Byte für den Buchstaben wie Sie möchten.

Je nachdem, was Sie eigentlich wollen, müssen Sie einen anderen Ansatz finden. Es ist nicht klar, was Sie zu zeigen versuchen, indem Sie in Bytes konvertieren, aber wenn Sie wirklich zu und von einer Bitstring konvertieren möchten (eine Zeichenfolge, die aus den numerischen Zeichen für 0s und 1s besteht), müssen Sie mehr arbeiten.

Wenn Sie die Zeichenfolge, die Sie erstellen, mit einem anderen Zeichen wie einem Komma trennen (z. B. 99,111,111,108), dann könnten Sie davon ausgehen, dass die abgegrenzten Teilzeichenfolgen ganze Zahlen sind (für reguläre ASCII-Zeichen) und an "Integer.parseInt (s)" übergeben. oder 'Integer.valueOf (s)' und führen Sie dann eine Umwandlung in char durch und bauen Sie dann die Zeichen in eine Zeichenkette ein.

Zum Beispiel:

StringBuilder sb = new StringBuilder(); 

String str = "99,111,111,108"; // result of initial conversion 
String[] sa = str.split(","); 

char ch = ''; 

for(String s : sa) { 
    ch = Integer.parseInt(s); 
    sb.append(ch); 
} 

FileOutputStream fos = new FileOutputStream("new.txt"); 

fos.write(sb.toString().getBytes()); 
fos.close(); 

Eine hier wichtige Anmerkung ist, dass für Java zumindest Zeichen sind nur ganze Zahlen, außer dass sie ein Zeichen als ein ASCII-Zeichen interpretiert wird.

Das grundlegende Dilemma ist, glaube ich, dass die Umwandlung der Bytes in Strings ist eine destruktive Operation, wo der Kontext verloren geht. I.e. Der Computer weiß nichts mehr über die ursprünglichen Bytes, nur was der neu erzeugte String ist. Bytes sind binäre Daten, aber Zeichenketten sind eine Gruppe von Zeichen (allgemein ascii, aber auch UTF verschiedener Arten).

4

Kann nicht gemacht werden. Das Problem besteht darin, dass in der Zeichenfolge "99111111108" die Abgrenzungen, wo ein Byte beginnt und endet, nicht enthalten sind. Mit anderen Worten, in dieser Zeichenfolge ist "9" das erste Zeichen oder "99"? diese

+0

Sagen wir, ich habe die Teilstrings 99, 111, 111, 108 – Lui

+0

kann ich die Teilstrings verwenden, um sie zu konvertieren? – Lui

2

Wenn Sie die Byte-Werte als Strings dargestellt haben, können Sie sie mit der Methode Byte.valueOf zurück in Bytes konvertieren.

byte b = getByte(); 
String byteAsString = Byte.toString(b); 
System.out.println(byteAsString); //might print something like '111' 

byte o = Byte.valueOf(byteAsString); 
assertEquals(b,o); //true 

Für mich allerdings scheint es, wie es besser wäre, nur die Daten in einen String gelesen direkt mit

new String(byteArray, encoding); 

wie dnault vorgeschlagen. Mit jeder Zeichenfolge erhalten Sie einen Charakter mit

"string".charAt(index); 

Auch ist es möglich, in der Schleife ein Zeichen direkt auf char durch Gießen Byte zu erhalten. Sie könnten diese

for(byte b: data){ 
    x += (char)b; 
} 
System.out.println(x); 

tun und dieser Code würde „cool“ angesichts der beispielhaften Eingangs Sie und drucken, obwohl dies eine sehr naive Ansatz ist, und Sie würden in Schwierigkeiten geraten, wenn Zeichen mit Werten größer als Byte des max-Wert.

Verwandte Themen