Morphée Posté(e) 9 février 2011 Share Posté(e) 9 février 2011 Bonjour, Désolé, je ne sais pas faire des titres courts, donc il résume pas mal les choses. Alors voilà mon problème : Je récupère dans mon programme une très longues chaîne en base64 qui représente un fichier (évident). Pour ne pas bouffer le peu de RAM pouvant être allouée à un objet dans Dalvik, je passe par un InputStream pour décoder, morceau par morceau ma chaîne de caractère. Voici la partie du code : boolean capturing = true; byte[] base64 = new byte[base64Buffer]; byte[] buffer = new byte[0]; String s = ""; while(capturing){ is.read(base64, 0, base64Buffer); s += new String(base64); if(s.contains("<GetFileResult>")){ String[] response = s.split("<GetFileResult>"); s = response[1]; } if(s.contains("</GetFileResult>")){ String[] response = s.split("</GetFileResult>"); s = response[0]; capturing = false; } int maxTreatableChars = (s.length()/4)*4; String s1 = s.substring(0, maxTreatableChars); String s2 = s.substring(maxTreatableChars, s.length()); buffer = Base64Coder.decode(s1); s = s2; fos.write(buffer); } Ce programme fonctionne parfaitement bien sur l'émulateur : si je traite une photo, elle est toute belle. Par contre si je passe par un vrai téléphone, j'ai des caractères incorrects au cours de la conversion base64 -> binaire. J'ai dû louper un truc sur l'architecture des téléphones, c'est pas possible !!! Testé avec Galaxy Tab (grosse RAM et gros proc) et Wildfire (petite RAM petit proc). Si quelqu'un a déjà rencontré ce type de souci, vous me rendriez vraiment service en me faisant part de votre expérience. Merci d'avance !!! Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 9 février 2011 Share Posté(e) 9 février 2011 Le problème vient peut être de la ligne s += new String(base64); où tu convertis un tableau d'octets en une chaîne de caractères, sans spécifier le charset (c'est à dire l'encodage de tes caractères; ils sont encodés comment, tes caractères ? UTF-8, iso8859-1 ? cp1252 ? ... ?). Il prend, du coup, l'encodage par défaut du device, et cela peut expliquer la différence de comportement entre deux plateformes Lien vers le commentaire Partager sur d’autres sites More sharing options...
Morphée Posté(e) 10 février 2011 Auteur Share Posté(e) 10 février 2011 Merci, mais j'avais déjà essayé. C'est vraiment gênant là ! Surtout que si je réduit la variable "base64Buffer", çà semble fonctionner (mais c'est très long). Il doit quand même y avoir une histoire d'encodage derrière, mais je ne vois pas où. EDIT : Comme je le pensais (mais je viens de vérifier au cas où), le système Android est en UTF-8 par défaut. Un nouveau test : en jouant sur la même variable "base64Buffer", çà peut aussi planter sur l'émulateur !! Alors bonne nouvelle, c'est un problème de code, pas de matériel (pas comme l'enregistrement de son avec un Defy. Je hais Motorola maintenant). Si je ne me trompe, le codage UTF-8 consiste en le codage d'un caractère sur au minimum 1 octet, mais sans garantie. Donc c'est de là que vient sans doute le problème. Mais encore un problème, c'est que je ne peux de toute façon pas garder toute la trame en mémoire avant traitement. La mettre dans un fichier me poserait le même problème, j'aurais affaire à un InputStream sans garantie de tomber juste en traitant les octets. Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 10 février 2011 Share Posté(e) 10 février 2011 Effectivement, en gérant la conversion byte<->caractère à la main, tu dois tomber sur des cas où un caractère est à cheval entre deux buffers, d'où erreur. Pourquoi ne pas passer finalement par un InputStreamReader, initialisé à partir de ton InputStream, et qui se chargera lui, de faire les conversions, de manière fiable qui plus est ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
Morphée Posté(e) 10 février 2011 Auteur Share Posté(e) 10 février 2011 Ben justement, dis-toi qu'après mon dernier post je me suis mis là-dessus. IDEM !!! Enfin, pour l'instant. Là je me bats encore avec çà. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.