2017-04-19 13 views
0

イメージをソケットに接続する必要があります。現在、私は.jpgファイルといくつかの他の不要なバイト(ffd8)を含むバイト配列を持っています。これらの不要なバイトをバイト配列から削除する必要があります。バイトを削除せずにファイルをダウンロードしようとしましたが、イメージが破損した形式になっています。だから私は私のbytearrayから不要なバイトを削除する方法を知りたいです。ソケット接続でイメージをダウンロードして不要なバイトを取り除く方法

while (!status) { 
         byte[] buffer = new byte[1024]; // or 4096, or more 
         int bytesRead = input.read(buffer, 0, buffer.length); 
         int availableBytes = input.available(); 

         str2 = str2.append(bytesRead); 
         ImageDataArray = concat(ImageDataArray, buffer); 
         countPackets = countPackets + buffer.length; 
         if (input.available() != 0) { 
          System.out.println("String:" + str1.toString()); 
         } else break; 
        } 
        System.out.println("--------------------out of while ------------------"); 
        File file = new File(Environment.getExternalStorageDirectory().getAbsoluteFile(), "/SteelmanPro/1020/images/image" +filename1); 
        if (!file.exists()) { 
         file.createNewFile(); 
        } 
       } 
       write(ImageDataArray, Environment.getExternalStorageDirectory().getAbsoluteFile() + "/SteelmanPro/1020/images/image" +filename1); 

CONCAT()メソッド:

public byte[] concat(byte[]...arrays) 
{ 
    // Determine the length of the result array 
    int totalLength = 0; 
    for (int i = 0; i < arrays.length; i++) 
    { 
     totalLength += arrays[i].length; 
    } 

    // create the result array 
    byte[] result = new byte[totalLength]; 

    // copy the source arrays into the result array 
    int currentIndex = 0; 
    for (int i = 0; i < arrays.length; i++) 
    { 
     System.arraycopy(arrays[i], 0, result, currentIndex, arrays[i].length); 
     currentIndex += arrays[i].length; 
    } 

    return result; 
} 

書き込み方法:ここに私のコードで

もいくつかの他の不要な.jpgファイルが含まれている

void write(byte[] aInput, String aOutputFileName) { 

    Log.e("dfd", "Writing binary file..."); 
    try { 
     OutputStream output = null; 
     try { 
      output = new BufferedOutputStream(new FileOutputStream(aOutputFileName)); 
      output.write(aInput); 
     } finally { 
      if (output != null) 
       output.close(); 
     } 
    } catch (FileNotFoundException ex) { 
     Log.e("dfd", "File not found."); 
    } catch (IOException ex) { 
     Log.e("dfd", "" + ex); 
    } 
} 
+0

十数個以上の空白行を削除しました。特にWeb上で垂直スペースを無駄にしないでください。 – EJP

答えて

1

バイト(ffd8) ファイルをダウンロードしようとしましたバイトを取り除くtは、私は

、発生する必要があるもの、あなたが「不要」バイトが実際にあることを考えるのをやめる作るためFFD8はあなたが破損で終わる、あなたはまだそれをしようと作られた削除など、破損した形式で画像を得ました"非常に欲しかった"?

実際にFF D8 FFはJPEGのmagic numberであり、JPEGファイルの一部です。

https://en.wikipedia.org/wiki/JPEG

+0

実際に私はそれを削除しませんでした。私はそれがJPEGファイルの開始を示していることを知っていました。私はこの魔法の番号の後にバイトを格納する必要があります – Liya

+1

あなたは破損したJPGファイルを格納する必要がありますか?ファイルごとに文字通り2バイトを「節約」しています。ここではユースケースについて本当に興味があります。 –

+0

バイト配列からマジックナンバーを削除する必要はありませんか? – Liya

1

あなたのコードは、エラーが散らばっています。

while (!status) { 
    byte[] buffer = new byte[1024]; // or 4096, or more 

この配列はループ外に配置する必要があります。あなたはどこにでもavailableBytesを使用していないではない、少なくともので、available()を呼び出す

int bytesRead = input.read(buffer, 0, buffer.length); 
    int availableBytes = input.available(); 

は、通常は無意味であり、これは例外ではありません。

 str2 = str2.append(bytesRead); 

これが画像の場合、Stringに保存しないでください。 Stringはバイナリデータのコンテナではありません。

 ImageDataArray = concat(ImageDataArray, buffer); 

あなたがImageDataArrayを投稿していないとして、これが何を意味するのかを知ることは不可能です。

 countPackets = countPackets + buffer.length; 

間違っています。 countPackets + bytesReadである必要があります。 read()がバッファをいっぱいにするとは仮定できません。それが価値を返す理由です。

available()の別の誤用。ストリームの終わり、またはメッセージの終わりのテストではありません。

  System.out.println("String:" + str1.toString()); 
     } else break; 
    } 
    System.out.println("--------------------out of while ------------------"); 
    File file = new File(Environment.getExternalStorageDirectory().getAbsoluteFile(), "/SteelmanPro/1020/images/image" +filename1); 
    if (!file.exists()) { 
     file.createNewFile(); 
    } 

同じ名前のnew FileOutputStream(...)を作成しようとしているように、このブロックは、冗長が、無駄なだけではありません。あなたはそれについてコメントすることは不可能である。このwrite()方法を投稿していないとして

} 
write(ImageDataArray, Environment.getExternalStorageDirectory().getAbsoluteFile() + "/SteelmanPro/1020/images/image" +filename1); 

連結()メソッド:

public byte[] concat(byte[]...arrays) 

署名が既に間違っています。これらの配列のいずれかがいっぱいであることはわかりません。上記を参照。

{ 
    // Determine the length of the result array 
    int totalLength = 0; 
    for (int i = 0; i < arrays.length; i++) 
    { 
     totalLength += arrays[i].length; 
    } 

    // create the result array 
    byte[] result = new byte[totalLength]; 

    // copy the source arrays into the result array 
    int currentIndex = 0; 
    for (int i = 0; i < arrays.length; i++) 
    { 
     System.arraycopy(arrays[i], 0, result, currentIndex, arrays[i].length); 
     currentIndex += arrays[i].length; 
    } 
    return result; 
} 

メソッド全体は必要ありません。受け取ったファイルにデータを書き込む必要があります。メモリを浪費し、レイテンシを追加する代わりに。

このようなコードは作成しないでください。

+0

'byte [] ImageDataArray =新しいバイト[0];' 。 write()メソッドを投稿しました。確認してください。 – Liya

関連する問題