我有一个 Android 应用程序 (Android 5.0),它应该使用 Windows 7 上的 C++ 程序(使用 boost 库实现)通过 WiFi 将图像发送到笔记本电脑。
当我发送图像时,笔记本电脑会收到 Android 设备发送的正确字节数。但是,当我想将图像保存到文件时,保存的字节数比我收到的多。因此,我无法打开它。我收到图像太大或损坏的消息。在notepad++中仔细查看,二进制数据似乎是正确的,除了笔记本电脑侧面有太多空行。
一个例子:
图片已发送:
长度 273650
台词 1975
单词 31088
图像接收和保存:
长度 274663
台词1979
单词 31088
笔记本电脑通过 WiFi 接收 273650 字节,但在保存时扩展了文件。手动删除行也没有解决问题。保存的文件中仍然有太多数据。
安卓代码
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();
}
}
});
}
知道可能是什么问题吗?我对套接字编程比较陌生。感谢您的帮助。
最佳答案
问题不太可能出在套接字上,它应该是关于将二进制数据写入文本。
尝试替换
std::ofstream myfile("Test.png", std::ios::app);
与
std::ofstream myfile("Test.png", std::ios::app|std::ios::binary);
编辑:为什么要以追加模式打开文件?您应该为每个文件写入一个 PNG 图像。
关于android - 通过 WiFi 将图像从 Android 发送/保存到 Windows 时数据过多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36280042/