2016-09-25 2 views
0

Ich habe eine Reihe von Bits mit der Länge 128 und ich möchte es in ein Byte-Array konvertieren, dann in eine Binärdatei schreiben und später aus der Binärdatei lesen und Byte-Array zu konvertieren Bit-Zeichenfolge. Dies ist mein Code (ich benutze eine Eingabe der Länge 16 der Einfachheit halber):Bit-String aus Binärdatei in Java lesen

String stest = "0001010010000010"; 
    //convert to byte array 
    short a = Short.parseShort(stest, 2); 
    ByteBuffer bytes = ByteBuffer.allocate(2).putShort(a); 
    byte[] wbytes = bytes.array(); 

    System.out.println("Byte length: "+ wbytes.length);  
    System.out.println("Writing to binary file"); 
    try { 
     FileOutputStream fos = new FileOutputStream("test.ai"); 
     fos.write(wbytes); 
     fos.flush(); 
     fos.close(); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    System.out.println("Reading from binary file"); 

    File inputFile = new File("test.ai"); 
    byte[] rdata = new byte[(int) inputFile.length()]; 
    //byte[] rdata = new byte[2]; 
    FileInputStream fis; 
    String readstr = ""; 
    try { 
     fis = new FileInputStream(inputFile); 
     fis.read(rdata, 0, rdata.length); 
     fis.close(); 
     for(int i=0; i<rdata.length; i++){ 
      Byte cb = new Byte(rdata[i]); 
      readstr += Integer.toBinaryString(cb.intValue()); 
     } 
     System.out.println("Read data from file: " + readstr); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

jedoch die Zeichenfolge, die ich aus der Datei lesen nicht gleich der ursprünglichen Zeichenfolge. Dies ist die Ausgabe:

String: 0001010010000010 
Byte length: 2 
Writing to binary file 
Reading from binary file 
Read data from file: 1010011111111111111111111111110000010 

Antwort

0

Ich würde beginnen, den Datentyp zu wählen, den ich für beide Szenarien verwende. Lass uns darüber nachdenken, du wählst Byte. Also, es zu schreiben ist ziemlich einfach.

byte data[] = ... //your data 
FileOutputStream fo = new FileOutputStream("test.ai"); 
fo.write(data); 
fo.close(); 

jetzt, lässt Stringized Daten aus der Datei lesen. Wie Sie wissen, ist 1 Byte 8 Bit. Sie müssen also nur 8 Zeichen aus der Datei lesen und in ein Byte umwandeln. So

FileInputStream fi = new FileInputStream("test2.ai"); // I assume this is different file 
StringBuffer buf = new StringBuffer(); 
int b = fi.read(); 
int counter = 0; 
ByteArrayOutputStream dataBuf = new ByteArrayOutputStream(); 
while (b != -1){ 
    buf.append((char)b); 
    b = fi.read(); 
    counter++; 
    if (counter%8 == 0){ 
    int i = Integer.parseInt(buf.toString(),2); 
    byte b = (byte)(i & 0xff); 
    dataBuf.write(b); 
    buf.clear(0,buf.length()); 
    } 
} 
byte data[] = dataBuf.toByteArray(); 

Ich denke, das Problem in Ihrem Code wird String Byte zu konvertieren. Dein Startpunkt ist schon falsch. Sie konvertieren Ihre Daten in Kurzform, die nur 2 Byte enthält. Aber Sie sagen, Ihre Datei kann 128 Bit, das sind 16 Byte, behalten. Sie sollten also nicht versuchen, eine ganze Datei in einen Datentyp wie short, integer oder long zu konvertieren. Sie müssen alle 8 Bit in Byte konvertieren.

+0

buf.clear Methode existiert nicht !!!!!!!!!! –

+0

Ich erinnere mich nicht an die tatsächliche Funktion. Zweck ist jedoch die Reinigung des Puffers. Der Methodenname könnte "sauber" sein. oder du kannst buf = new verwenden StringBuffer(); – Adem