Bonjour tout le monde. J'ai un probleme assez bizarre.
Pour faire simple , je me connecte à un serveur, via un telephone portable, qui doit m'envoyer des images. Je les lis par blocs (peut pas faire autrement), pour stocker les tableaux de bytes lus, j'utilise un ByteArrayOutputStream, le probleme c'est qu'il me cause des erreures. Pas d'exception ou ce genre de chose, mais les données sont mal stockées, ou deplacées, qui sait.
Je precise que je n'ai aucun pouvoir de modifications sur le serveur, il est ecrit en C, mon code :
je precise que je ne met le code que du thread qui lit les données du serveur, le thread d'ecriture, et de lancement d'application n'ont aucun interet ici, et je ne met que le code de lecture et de verification des données
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
 
InputStream in_stream;  
//lecturre des données, et stockage dans un ByteArrayOutputStream
     public int ReadData(ByteArrayOutputStream bytearray,int sizeData)
    {
    	//declarations des variables locales
 
    	//nombre d'octets restant à lire
    	int remaingbytes = sizeData;
    	//nombre d'octets lus à la derniere lecture
    	int read = 0;
    	//si il y a une erreur
    	boolean arret = false;
    	//tableau intermediaire
    	byte[] data = new byte[sizeData];
 
    	byte[] tabData = new byte[sizeData];
    	//nombres courant d'octets lus
        int totalread = 0;
        try{
        	//tant qu'il reste des octets à lire
        	while(remaingbytes > 0)
	         {
        		//on essaye de lire le plus grand nombre à la fois
	             read = in_stream.read(data, 0, remaingbytes);
	             //il y a une erreur, ou on arrive en fin de lecture prematurement
	             if (read == -1)
	             {
	                 arret = true;
	                 break;
	             }
	             //on insere le bloc qui vient d'etre lu dans le buffer de sortie
	             else{
	            	 bytearray.write(data,totalread , read); 
 
	            	 for(int ind = 0;ind<read;ind++ )
	            		 tabData[ind + totalread] = data[ind];
	             }
 
	             //on calcul le nombre d'octets restant à lire, selon les octects qui viennent 
	             //d'etre recupérés
	             remaingbytes = remaingbytes - read;
	             //on ajoute à la taille totale
	             totalread += read;
	         }
        	data = null;
//verification des données
if(VerifyData(bytearray,sizeData))
	addDebug("Verify2 OK !!!!", null,5);
else
	addDebug("Verify2 KO ####", null,5);
	         if (arret || read == -1 || totalread != sizeData)
	         {
	        	 //addDebug("    Error "+  remaingbytes +"/" +totalread, null,2);
	         }
         }
        catch(IOException e)
        {
        	System.out.println("    IOException "+  remaingbytes +"/" +totalread);
        }catch(NullPointerException e)
        {
        	System.out.println("    NPException"+  remaingbytes +"/" +totalread);
        }
         //on renvoie la taille du bloc lu
         return sizeData;
    }
 
//verification des données 
public boolean VerifyData(ByteArrayOutputStream bytearray,int sizeData)
    {
    	byte[] tabData =bytearray.toByteArray();
    	byte compt = 0;
    	for(int ind = 0 ; ind < sizeData ; ind ++)
    	{
    		if(compt >= 255)
    			compt = 0;
    		if(tabData[ind] != compt)
    		{
    			addDebug("-Byte ind "+ind+":"+(new Byte(compt)).toString() 
    					+ "/"+(new Byte(tabData[ind])).toString(), null, 4);
    			return false;
    		}
    		compt ++;
    	}
    	return true;
    }
pour verifier les données, c'est tout bete, le serveur m'envoie un tableau de byte {0,1,2....,253,254,255,0,1,2...255,0......}, donc suffit de faire une boucle for

Merci de votre aide