2016-03-29 11 views
1

Windows 7でC++プログラムを使用してWiFi経由で画像を送信するAndroidアプリケーション(Android 5.0)があります(ブーストライブラリ)。AndroidからWindowsにWiFi経由で画像を送信/保存する際にデータが多すぎる

イメージを送信すると、ラップトップはAndroidデバイスによって送信された正しい量のバイトを受信します。しかし、画像をファイルに保存したい場合は、保存したバイト数よりも多くのバイトが保存されています。したがって、私はそれを開くことができません。イメージが大きすぎる、または壊れているというメッセージが表示されます。メモ帳++の詳細を見ると、バイナリデータは正しいと思われますが、ラップトップの側面には空行が多すぎます。

アン例:

画像sendedでは:
長さ273650
行1975
単語31088

受信した画像や保存
長さ274663
行1979
言葉31088

ラップトップはWiFi経由で273650バイトを受信しますが、保存中にファイルを拡張します。手動で行を削除しても問題は解決されませんでした。まだ保存されているファイルには多すぎるデータがあります。

Androidのコード

try { 
    final OutputStream outputStream = streamSocket.getOutputStream(); 
    final ByteArrayOutputStream bufferStream = new ByteArrayOutputStream(); 

    thermalBitmap.compress(Bitmap.CompressFormat.PNG, 100, bufferStream); 

    bufferStream.flush(); 
    (new Thread() { 
     @Override 
     public void run() { 
      super.run(); 

      try { 
       synchronized (streamSocket) { 

        bufferStream.writeTo(outputStream); 
        outputStream.flush(); 
       } 

       bufferStream.close(); 

      } catch (IOException ex) { 
       Log.e("STREAM", "Error sending frame: " + ex.toString()); 
      } 
     } 
    }).start(); 

} catch (Exception ex){ 
     Log.e("STREAM", "Error creating PNG: "+ex.getMessage()); 
} 

C++コード

void do_read() 
{ 
    auto self(shared_from_this()); 
    socket_.async_read_some(boost::asio::buffer(data_, max_length), 
     [this, self](boost::system::error_code ec, std::size_t length) 
    { 
     if (!ec) 
     {     
      std::string test = std::string(data_, length); 

      std::ofstream myfile("Test.png", std::ios::app); 
      if (myfile.is_open()) 
      { 
       myfile << test; 
       myfile.close(); 
      } 
     } 
    }); 
} 

問題何ができるか任意のアイデア?ソケットプログラミングには比較的新しいです。すべての助けに感謝します。

+0

バイナリデータを保存するために文字列I/Oを使用しないでください。なぜ画像を直接ソケット出力ストリームに圧縮していないのですか?中間の 'ByteArrayOutputStream'はまったく必要ありません。時間と空間の無駄です。 – EJP

+0

私はその返事のおかげで、それを変更します。しかし、それは問題を解決しませんでした。 – harLfkk

+0

ストリームに関する部分は問題ではありません。だから私は答えの代わりにコメントとして投稿した。文字列に関する部分は、問題の少なくとも一部です。 – EJP

答えて

0

問題はソケットには当てはまりません。バイナリデータがテキストとして書き込まれている必要があります。なぜあなたは追加モードでファイルを開くには:

std::ofstream myfile("Test.png", std::ios::app|std::ios::binary); 

EDITで

std::ofstream myfile("Test.png", std::ios::app); 

を交換してみてください?ファイルごとに1つのPNGイメージを書き込む必要があります。

関連する問題