2011-03-30 3 views
3

Je me bats avec le transfert d'un simple fichier jpeg dans une balise ID3v2 de C++ sur une socket TCP java (Android). La bibliothèque "taglib" propose d'extraire ce fichier et je suis capable de sauvegarder le fichier jpeg sous un nouveau fichier.transfert jpeg de C++ pour Android (java)

La fonction d'envoi ressemble à ceci

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; 

F3-> image(). Les données() renvoie un pointeur sur la structure interne de données (il retourne char *) et F3- > picture(). size() renvoie la taille du tableau.

Puis Android reçoit avec

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

Mais en quelque sorte decodeByteArray retourne toujours nulle. Mon idée est que Java ne reçoit pas l'image correctement car imageString ne comporte que 4 caractères ... alors que le fichier jpeg extrait a une taille de 12,7 Ko. Mais qu'est-ce qui a mal tourné?

Martin

+1

Ne pas le lire en chaîne. Ce n'est pas une chaîne. Lisez-le comme les octets bruts. –

Répondre

2

Vous ne devriez pas utiliser les fonctions de chaîne sur des données d'octets, car 0 valeurs sont prises comme terminateurs de chaîne. Essayez de regarder dans memcpy sur le côté C si vous avez besoin de copier les char* et aussi les fonctions de lecture byte[] pour InputStream du côté Java.

+0

Ah merci pour cet indice! Maintenant ça marche. D'abord, je transmets la taille du fichier en octets (coverLength) puis chaque octet de l'image avec send (c, f3-> picture(). Data(), coverLength, 0). La propriété coverLength est correctement reçue mais la fonction read (byte [], int, int) s'arrête de façon trop précoce. longueur int = InputStream.read (imageBytes, 0, coverLength) retourne toujours moins coverLength octets ... – martin

+0

Oui, vous obtiendrez pas nécessairement l'ensemble du tableau d'octets à la fois. Vous devriez appeler read dans une boucle et garder une trace du nombre d'octets que vous avez lus. Alternativement, vous pouvez utiliser ApouS commons IOUtils, qui a une belle méthode utilitaire appelée 'toByteArray': http://commons.apache.org/io/api-release/org/apache/commons/io/IOUtils.html#toByteArray(java .io.InputStream) –

+0

Ah la taille maximale des paquets, merci! IOUtils n'est pas disponible dans le SDK Android. Après une dure lutte, le transfert fonctionne presque maintenant. d'abord, je vous envoie la longueur: sprintf_s (buf, 10, "% d \ n", coverLength); envoyer (c, buf, strlen (buf), 0); puis les fragments de données sont envoyés. Simultanément, les données sont lues. Le coverLength avec inFromServer.readLine() et les données avec pour (int count = 0; compteur martin