2016-09-24 3 views
3

Ich arbeite an einer Huffman Java-Anwendung, und ich bin fast fertig. Ich habe jedoch ein Problem. Ich muss eine Zeichenfolge von etwas wie "101011101010" in einer Datei speichern. Wenn ich es mit meinem aktuellen Code speichere, speichert es es als Zeichen, die 1 Byte alle 0 oder 1 aufnehmen. Ich bin ziemlich sicher, dass es möglich ist, alle 0/1 als ein bisschen zu speichern.Zeichenfolge von 0 und 1 zu Datei als Bits

Ich habe schon einige Dinge mit BitSet und Integer.valueOf versucht, aber ich kann sie nicht zur Arbeit bringen. Dies ist mein aktueller Code:

FileOutputStream fos = new FileOutputStream("encoded.bin"); 
fos.write(encoded.getBytes()); 
fos.close(); 

Wo codiert 'ist ein String, der wie sein: "0101011101". Wenn ich versuche, es als Ganzzahl zu speichern, wird die führende 0 entfernt.

Vielen Dank im Voraus!

EDIT: Huffman ist eine Komprimierungsmethode, daher sollte die ausgegebene Datei so klein wie möglich sein.

+0

Warum soll die Zeichenfolge in Ganzzahl konvertiert werden? Ist es nicht möglich, den String mit führenden 0s zu speichern, wenn ein String ohne führende 0s gespeichert werden kann? Was genau ist dein Problem? – Pat

+0

Nun, es ist eine Komprimierungsmethode. Also wird ein 'a' oder 'b' in etwas wie 0110 übersetzt (was 4 Bits und nicht 1 Byte ist). Das Problem ist, dass ich die 1 und 0 als 1 Byte speichere, so dass es keine Komprimierung gibt (es ist jetzt noch schlimmer). –

Antwort

2

Ich glaube, ich habe meine Antwort gefunden. Ich habe die 1 und 0 in einem BitSet mit dem folgenden Code:

BitSet bitSet = new BitSet(encoded.length()); 
int bitcounter = 0; 
for(Character c : encoded.toCharArray()) { 
    if(c.equals('1')) { 
     bitSet.set(bitcounter); 
    } 
    bitcounter++; 
} 

Danach habe ich es in der Datei speichern mit bitSet.toByteArray() Wenn ich es lesen will wieder ich es konvertieren zurück zu einem bitset mit BitSet.valueOf(bitSet.toByteArray()). Dann binde ich das Bitset wie folgt durch:

Danke an alle, die mir geholfen haben.

0

Binärdateien sind auf das Speichern von Bits in Vielfachen von acht begrenzt. Sie können dieses Problem lösen, indem Sie die Zeichenfolge in Acht-Bit-Stücke hacken, sie zu Bytes Umwandlung Byte.parseByte(eightCharString, 2) verwenden und sie in ein Byte-Array hinzu:

  • Berechnen Sie die Länge des Byte-Array durch die Länge der Bitkette Dividieren durch acht
  • Weisen ein Array von Bytes der gewünschten Länge
  • Run eine Schleife, die Teilstrings aus der Zeichenfolge an den Positionen repräsentieren ein Vielfaches von acht
  • Parse jeder Chunk, und das Ergebnis in das entsprechende Byte
  • nimmt
  • Rufen Sieanauf dem Byte-Array
+0

"Parsen Sie jeden Chunk, und setzen Sie das Ergebnis in das entsprechende Byte" das ist, wo ich feststecke. Ich kann Integer.parseInt nicht verwenden, da dadurch die führenden Nullen entfernt werden. Wenn ich Byte.parseByte (s, 2) versuche, funktioniert es nicht, weil es nicht signiert ist. –

+0

@LuudvanKeulen Welche Ausnahme erhalten Sie? Übrigens, wenn das Parsen von 'int' gut funktioniert, können Sie das' int'-Ergebnis in 'byte' umwandeln, und es wird auch funktionieren. – dasblinkenlight

+0

'java.lang.NumberFormatException: Wert außerhalb des gültigen Bereichs.Wert: "11101101" Radix: 10 'Ich habe gelesen, dass es so ist, weil es nichts akzeptiert, was höher ist als ein bestimmter Wert, also ist 1111111 nicht möglich. –

0

Versuchen Sie es.

String encoded = "0101011101"; 
FileOutputStream fos = new FileOutputStream("encoded.bin"); 
String s = encoded + "00000000".substring(encoded.length() % 8); 
for (int i = 0, len = s.length(); i < len; i += 8) 
    fos.write((byte)Integer.parseInt(s.substring(i, i + 8), 2)); 
fos.close(); 
+0

Wenn ich mich nicht irre, wird das den Dezimalwert des BinaryString richtig erhalten? Es funktioniert, wenn ich es speichere, aber wenn ich versuche es zu lesen, werden alle führenden Nullen entfernt. Zum Beispiel: Ich tue 'Integer.parseInt (" 00001111 ", 2)' was 15 zurückgibt. Wenn ich versuche, "Integer.toBinaryString (15)" zu tun, wird 1111 zurückgegeben. –

+0

Sie sollten tun, wie "String s =" 00000000 "+ Integer.toBinaryString (15);' und 'String dekodiert = sstring (s.length() - 8);' – saka1029

Verwandte Themen