2016-05-06 11 views
0

Ich übe die Huffman-Codierung aus meiner Programmierklasse. Ich habe fast alle Kodierungsteile gemacht. Zum Beispiel habe ich jedem Zeichen einen Code (d. H. A = 100100) zugewiesen und wandle jedes Zeichen im Text entsprechend seinem Code um. Dann parse ich jeden Code in eine Liste von Bytes, wie das Analysieren von 100100 in ein Byte und das Speichern in der Liste. Allerdings muss ich alle Bytes in eine TXT-Datei schreiben. Ich habe festgestellt, dass es ein Problem gibt.Java schreiben Byte in eine TXT-Datei

Beispiel: Ein Zeichen hat den Code "1001" und es wird in die TXT-Datei als 1 Byte statt nur 4 Bit geschrieben.

Ich weiß, dass nach dem Huffman-Codierung, Zeichen in einem Format wie gespeichert werden: „11100111101011111101011011111000010000101“ aber jetzt meine Situation ist jedes Zeichen nimmt 1 Byte Größe, die vor der Codierung nicht anders in der Größe mit der ursprünglichen Eingabedatei hat .

Gibt es eine Möglichkeit, den Code im Format "11100111101011111101011011111000010000101" zu speichern?

Entschuldigung für mein Englisch, ich versuchte mein Bestes, um meine Verwirrung zu erklären.

+0

Sie müssen jedes Byte als binäre Zeichenfolge schreiben. [This] (http://stackoverflow.com/questions/4421400/how-to-get-0-padded-binary-representation-of-an- integer-in-java) Thema kann Ihnen helfen. –

+0

Ich habe gerade Ihre Methode versucht, wenn ich Zeichenfolge anstelle von Byte in die Datei schreiben, wäre die Dateigröße 10 mal größer. – Ming

+0

Das ist der Unterschied zwischen TXT und Binärformat. –

Antwort

0
try (FileWriter fw = new FileWriter("out.txt")) { 
    try (BufferedWriter bfw = new BufferedWriter(fw)) { 
     char[] buffer = str.toCharArray(); 
     for (int i = 0; i < buffer.length; i++) { 
      bfw.write(Integer.valueOf(Byte.valueOf((byte) buffer[i]).intValue()).toBinaryString()); 
     }  
    } 
} 
0

Sie könnten ein BitSet Objekt verwenden, wenn Sie alle Bits im Speicher zu halten beabsichtigen.

BitSet bits = new BitSet(); 
bits.set(7000, true); 
if (bits.get(7000)) { ... } 
byte[] bytes = bits.toByteArray(); 

Path path = Paths.get("C:/Temp/huffman.bin"); 
Files.writeBytes(path, bytes); 

Die sofortige Verwendung von Bytes ist möglich.

Sie können jedoch keine Zeichen schreiben; Es gibt eine Umwandlung, die Dinge vermasselt. Mind Char ist 16 Bits UTF-16 formatiert, um Unicode zu enthalten.

Dies schreibt binäre Daten, nicht Text.

Für nachlaufende Bits, ich weiß nicht, wie Huffman damit umgeht, ein bisschen Forschung; Ich denke, Bits 0 werden tun und keine Artefakte erzeugen. Vielleicht fügen Sie die ersten 0-7 Bits eines längeren Codes hinzu. Polsterung ist das Schlüsselwort.