2011-03-30 117 views
3

我正在努力將ID3v2標記內的簡單jpeg文件從TCP ++套接字轉換爲java(Android)。庫「taglib」提供提取這個文件,我可以將jpeg保存爲一個新文件。將jpeg從C++傳輸到android(java)

發送函數看起來像這樣

char *parameter_full = new char[f3->picture().size()+2]; 
sprintf(parameter_full,"%s\n\0",f3->picture().data()); 

// send 
result = send(c,parameter_full,strlen(parameter_full),0); 

delete[] parameter_full; 

其中

[3->圖像()。數據()返回一個指針的內部數據結構(它返回的char *)和 [3- > picture()。size()返回數組的大小。

然後用Android的

String imageString = inFromServer.readLine(); 
byte[] imageBytes = imageString.getBytes(); 
Bitmap cover = BitmapFactory.decodeByteArray(imageBytes,0,imageBytes.length); 

接收它但不知何故decodeByteArray總是返回null。我的想法是,Java沒有正確接收圖像,因爲imageString只包含4個字符......而提取的jpeg文件的大小爲12.7 KB。 但是出了什麼問題?

馬丁

+1

不要以字符串形式讀取它。這不是一個字符串。以原始字節讀入。 – 2011-03-30 18:46:39

回答

2

你不應該在字節的數據,因爲0值作爲字符串終止使用字符串函數。嘗試在C++端查看memcpy,如果您需要在Java端複製InputStreamchar*byte[]讀功能。

+0

啊,謝謝你的提示!現在它正在工作。首先,我以字節(coverLength)傳輸文件大小,然後使用send(c,f3-> picture()。data(),coverLength,0)傳輸圖片的每個字節。 coverLength被正確接收,但不知何故read(byte [],int,int)函數過早停止。 int length = inputStream.read(imageBytes,0,coverLength)總是返回小於coverLength字節... – martin 2011-03-31 09:53:17

+0

是的,你不一定會得到整個字節數組。您應該在循環中調用read並記錄您讀取的字節數。或者,您可以使用Apache commons IOUtils,它有一個很好的實用程序方法,名爲'toByteArray':http://commons.apache.org/io/api-release/org/apache/commons/io/IOUtils.html#toByteArray(java .io.InputStream) – 2011-03-31 14:28:36

+0

啊最大包大小,謝謝! IOUtils在Android SDK中不可用。經過艱苦的鬥爭,轉會現在幾乎奏效。 首先,我發送長度: sprintf_s(buf,10,「%d \ n」,coverLength); (c,buf,strlen(buf),0); 然後發送數據片段。同時讀取數據。與 inFromServer.readLine() 並用 爲數據coverLength(詮釋計數= 0;計數 martin 2011-03-31 17:17:21