2011-03-30 119 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