我有一个Android应用程序(Android 5.0),应该通过WiFi将图像发送到使用Windows 7上的C++程序的笔记本电脑(使用增强库)。通过WiFi将图像从Android发送/保存到Windows时数据太多
当我发送图像时,笔记本电脑会收到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