2017-02-22 14 views
-3

したがって、1と0の何千もの文字列をバイナリとしてファイルに保存したいので、ファイルサイズが小さくなります。残念ながら、私はNumberFormatExceptionsを実行しなければそれを行う方法を理解できません。1と0の文字列をバイナリファイルに変換する

私はByte.parseByteを試しましたが、うまくいかないようです。どんな助けでも大歓迎です。

try { 
     File file = new File(BINARY_FILE); 
     DataOutputStream dso = new DataOutputStream(new FileOutputStream(file)); 
     for (int j = 0; j < bits.length(); j += 8) { 
      Byte b = Byte.parseByte(bits.substring(j, j + 8)); 
      dso.write(b); 
     } 
    } catch (IOException e) { 
     System.out.println("Error"); 
    } 
+0

あなたが試したコードを表示 –

+0

さらに、bits変数は1と0の文字列です。 – BananaPineapple

+0

また、Stringの長さが8で割り切れることが保証されていますか? –

答えて

2

もしあなたがしたいのは、バイトを書くことです。DataOutputStreamで囲まないでください。

完了したらファイルストリームを閉じるには、try-with-resourcesも使用する必要があります。

8ビットを解析する場合、基数2を指定する必要があります。それ以外の場合は、バイナリではなく、ベース10の数値を解析しています。

解析は、符号付きの数のためであるので、あなたは、8ビットの符号なしバイトを使用していることから、あなたの代わりにbyteの、intに解析する必要があります。

valueOf()を使用するのではなく、parseInt()を使用してください。 boxedオブジェクトを取得する必要はありません。

だから、コードは次のようになります

try { 
    File file = new File(BINARY_FILE); 
    try (FileOutputStream out = new FileOutputStream(file)) { 
     for (int j = 0; j < bits.length(); j += 8) { 
      int b = Integer.parseInt(bits.substring(j, j + 8), 2); 
      out.write(b); 
     } 
    } 
} catch (IOException e) { 
    System.out.println("Error"); 
} 

parseByte(s, 2)は(-128 )"-10000000"間の値をサポートし"01111111"(127 )onluそれように、署名された解析です。 1で始まる8桁の2進数は、java.lang.NumberFormatException: Value out of range. Value:"11111111" Radix:2

+0

8ビットバイトの場合には32ビット整数を使用するのは少し非効率ですが、それは符号のためです。 –

+0

@DM [write() '](https://docs.oracle.com/javase/8/docs/api/java/io/FileOutputStream.html#write-int-)は、パラメータとして' int'をとります。これは下位8ビットのみを使用しているにもかかわらず、 'byte'、' short'、 'int'のいずれの場合でも、int型に変換されます。エラーなしでバイトにパースすることはできないので、 'int'をパースすることもできます。なぜなら、それはメソッドが望んでいるからです。 – Andreas

+0

これはうまくいくように見えましたが、何か良いことがあれば改善し続けます。 – BananaPineapple

1

で失敗します。まだ奇妙なビットを扱う方法を取り上げたいと思います。

個々のビットをファイルに書き込むことはできません。バイトのみを書き込むことはできません。ファイル・サイズは常にフル・バイトであり、ファイル・サイズがバイトのファイルをJavaが処理できるとしても、ファイル・システムは処理できませんでした。

for (int j = 0; j < bits.length(); j += 8) { 
     int b; 
     if (j + 8 < bits.length()) 
     { 
      b = Integer.parseInt(bits.substring(j, j + 8), 2); 
     } 
     else 
     { 
      b = Integer.parseInt(bits.substring(j), 2); 
     } 
     dso.write(b); 
    } 

今、あなたのsubstringは、文字列の終わりをオフに行くことはありません。

は、出力するために、または完全な8であってもなくてもよいものを最後の数桁が、あなたはこのような何かを行うことができます。

"00001111"で終わる文字列と "1111"で終わる文字列(同じバイト値を持つ)を区別する方法は、おそらくファイルの先頭に値はbits.length % 8です。これにより、最後のバイトをどのように処理するかを知ることができます。たとえば、6の場合、1111は実際には「001111」で、「1111」ではないことがわかります。それが4なら、それは本当に "1111"でした。

関連する問題