probleme de stockage de données avec un ByteArrayOutputStream
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:
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