2016-03-29 13 views
1

Windows 7'de Program (Windows 7'de Program) kullanarak bir dizüstü bilgisayara WiFi aracılığıyla bir görüntü göndermesi gereken bir Android Uygulaması (Android 5.0) var.). Görüntüyü gönderdiğimde, Laptop Android cihaz tarafından gönderilen doğru bayt miktarını alır. Ancak, görüntüyü bir dosyaya kaydetmek istediğimde, aldığımdan daha fazla kaydedildi. Bu yüzden onu açamıyorum. Görüntünün çok büyük veya hasarlı olduğunu anladım. Notepad ++ 'da daha yakından bakıldığında, ikili veriler dizüstü bilgisayarın yan tarafında çok fazla boş satır olması dışında doğru gibi görünüyor.Bir görüntüyü Android'den Windows'a Wi-Fi yoluyla gönderirken/kaydederken çok fazla veri

Bir Örnek:

Görüntü Sended:
Uzunluk 273.650
Hatları 1975
Kelimeler 31088

Görüntü Alınan ve Kaydedilen:
Uzunluk 274.663
Hatları 1979
Kelimeler 31088

Dizüstü Bilgisayar, WiFi yoluyla 273650 Byte alır, ancak kaydederken dosyayı genişletir. Çizgileri elle silmek sorunu çözmedi. Kaydedilen dosyada hala çok fazla veri var.

Android Kod

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++ Kod

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(); 
      } 
     } 
    }); 
} 

sorun ne olabilir Herhangi Fikir? Soket programlamaya nispeten yeniyim. Her yardım takdir edilir.

+0

İkili verileri kaydetmek için dize I/O kullanmamalısınız. Ve neden görüntüyü doğrudan soket çıkış akımına sıkıştırmıyorsunuz? Hiçbir zaman 'ByteArrayOutputStream' aramasına ihtiyacınız yok. Sadece zaman ve mekan kaybıdır. – EJP

+0

Bunu değiştireceğim, cevap için teşekkürler. Ama sorunu çözmedi. – harLfkk

+0

Akışlarla ilgili kısım sorun değil. Bu yüzden bir cevap yerine yorum olarak yayınladım. Dizelerle ilgili kısım, sorunun en azından bir kısmıdır. – EJP

cevap

0

Sorunun soketlerle ilgili olması olası değildir, her şey metin olarak yazılan ikili verilerle ilgili olmalıdır.

deneyin

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

EDIT'e

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

değiştirilmesi: Neden modu ekleme dosyayı açmak mı? Dosya başına bir PNG resmi yazmalısınız.

İlgili konular