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();
}
}
});
}
問題何ができるか任意のアイデア?ソケットプログラミングには比較的新しいです。すべての助けに感謝します。
バイナリデータを保存するために文字列I/Oを使用しないでください。なぜ画像を直接ソケット出力ストリームに圧縮していないのですか?中間の 'ByteArrayOutputStream'はまったく必要ありません。時間と空間の無駄です。 – EJP
私はその返事のおかげで、それを変更します。しかし、それは問題を解決しませんでした。 – harLfkk
ストリームに関する部分は問題ではありません。だから私は答えの代わりにコメントとして投稿した。文字列に関する部分は、問題の少なくとも一部です。 – EJP