2017-04-20 2 views
0

Je travaille actuellement avec un arbre Huffman pour compresser/décompresser des fichiers texte. Actuellement, mon problème est que lorsque j'écris des octets et que je les lit, je perds les 0 premiers de mes nombres.Integer.toBinaryString() Perd les 0 principaux

Dans ma classe OutputStream, ma méthode writeBit(), je suis alimenté un bit à la fois et lorsque mon compte de bits atteint 8, j'écris l'octet dans le fichier. Actuellement en utilisant une chaîne pour construire ce nombre binaire, bien que le problème se produit lors de l'écriture du bit.

HuffmanOutputStream.java:

/** 
* Created by Sully on 3/20/2017. 
*/ 

import java.io.IOException; 


public class HuffmanOutputStream extends BitOutputStream { 

private int count = 0; 
private String bytes = ""; 

public HuffmanOutputStream(String filename, String tree, int totalChars) { 
    super(filename); 
    try { 
     d.writeUTF(tree); 
     d.writeInt(totalChars); 
    } catch (IOException e) { 
    } 
} 

public void writeBit(int bit) { 
    //PRE bit == 0 || bit == 1 
    if (count < 8) { 
     bytes += bit; 
     count++; 
    } 
    try { 

     if (count == 8) { 
      d.writeByte(Integer.parseInt(bytes, 2)); 
      count = 0; 
      bytes = ""; 
     } 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 


public void close() { 

} 
} 

Un exemple quand les choses tournent mal, pour mon fichier texte, le premier octet que je construis est 01100001, bien que lorsque j'utilise Integer.parseInt (octet, 2), l'entier donné est 97, et quand il est lu comme un nombre binaire, retourne seulement 1100001. Comme les Huffman Trees comptent sur ces 0 inclus, comment puis-je garder ce 0 en place? Aussi pour s'assurer qu'il est lu correctement avec les 0 restant en place?

HuffmanInputStream.java:

/** 
* Created by Sully on 3/20/2017. 
*/ 

import java.io.IOException; 

public class HuffmanInputStream extends BitInputStream { 
    private String tree; 
    private int totalChars; 

    private int currentByte; 
    private int bitCount; 
    private static final int BYTE_SIZE = 8; 
    private int[] bufferedBits = new int[BYTE_SIZE]; 


public HuffmanInputStream(String filename) { 
    super(filename); 

    try { 
     tree = d.readUTF(); 
     totalChars = d.readInt(); 
     currentByte = 0; 
     bitCount = 8; 

    } catch (IOException e) { 
    } 
} 


public int readBit() { 

    if (currentByte == -1) { 
     return -1; 
    } 


    if (bitCount == 8) { 
     try { 
      currentByte = d.read(); 
      if(currentByte == -1){ 
       return -1; 
      } 
      String binary = Integer.toBinaryString(currentByte); 
      for (int x = 0; x < binary.length(); x++) { 
       bufferedBits[x] = Character.valueOf(binary.charAt(x)); 
      } 
      bitCount = 0; 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 

    int val = bufferedBits[bitCount]; 

    bitCount++; 

    return val % 2; 


} 

public String getTree() { 
    return tree; 
} 

public int totalChars() { 
    return totalChars; 
} 

public void close() { 
    try { 
     d.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
} 

Je sais qu'il est un peu long d'une question, mais toute aide est grandement appréciée!

+0

Il semble que votre problème soit juste avec 'Integer.toBinaryString'. –

+0

@LouisWasserman cela vous dérange-t-il d'expliquer quel pourrait être le problème? J'essaie juste de comprendre pourquoi je perds ces 0. Ai-je besoin de faire une sorte de rembourrage/changement de bit? –

+1

Cela n'a rien à voir avec les nombres ou le remplissage ou le décalage de bits, et tout ce qui concerne le choix de 'Integer.toBinaryString' comme moyen de convertir un' int' en une séquence de 0 et de 1. 'Integer.toBinaryString' ne va pas générer de zéros en tête du tout. –

Répondre

2

Je suppose que vous cherchez à avoir suffisamment de 0 pour faire la longueur du String qui est retourné de Integer#toBinaryString 8; le code suivant va réaliser ceci pour vous:

String binary = String.format("%8s", Integer.toBinaryString(currentByte)).replace(' ', '0'); 
+0

Merci beaucoup! J'ai trouvé une autre solution similaire à ce droit que vous avez répondu. Merci encore. –

+0

De rien! –