IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Incrompréhension classe MemoryStream


Sujet :

C#

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 11
    Points : 9
    Points
    9
    Par défaut Incrompréhension classe MemoryStream
    Bonjour,
    J'ai un petit soucis sur la compréhension de la classe MemoryStream, et j'espère que quelqu'un pourra éclairer mes lumières.

    J'utilise un MemoryStream qui contiens des données XML pour ensuite être lu par XmlTextReader.

    J'ai essayé ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MemoryStream StreamXml = new MemoryStream();
    StreamXml.SetLength(DataUnZip.Length);
    StreamXml.Write(DataUnZip, 0, DataUnZip.Length);
    Mais impossible d'écrire dans StreamXml, j'ai CanRead et CanWrite à false.

    Du coup j'ai changer de méthode et j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MemoryStream StreamXml = new MemoryStream(DataUnZip);
    Et cela marche très bien.

    Est ce qu'une personne bien intentionnée pourrai me dire pourquoi le premier extrait de code n'a pas marché.

    Merci à vous

    Renaud

  2. #2
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Je n'ai pas de problème de mon côté avec le premier bout de code, en testant avec quelque chose de très basique en tout cas.

    De toute façon, faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MemoryStream StreamXml = new MemoryStream();
    StreamXml.SetLength(DataUnZip.Length);
    StreamXml.Write(DataUnZip, 0, DataUnZip.Length);
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MemoryStream StreamXml = new MemoryStream(DataUnZip);
    revient au même si DataUnZip contient toutes les données à traiter, et donc qu'il n'y a rien à rajouter au MemoryStream par la suite.

    La différence c'est que si tu initialises le MemoryStream avec un byte[], alors la taille du stream est fixe à ce moment. Mais tu trouveras sûrement plus d'infos sur la MSDN au niveau des constructeurs de la classe MemoryStream
    Pas de questions techniques par MP

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    Merci pour ta réponse très rapide.

    Tu as raison ça marche. Mais a force de chercher et de modifier le code je me suis trompé et n'ai pas pris le cas qui ne marchait pas.

    MemoryStream StreamXml= new MemoryStream(); est déclarée en privé dans la classe.
    Et je l'utilise à la fin de DeComprime ()

    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
     
    	public class UnzipInfoRepertoire
    	{
    		private byte[] DataZip;
    		private MemoryStream StreamXml= new MemoryStream();
    		private XmlTextReader FichierXml;
     
    		public UnzipInfoRepertoire( byte[] DonnéesZipé )
    		{
    			this.DataZip = new byte[DonnéesZipé.Length];
    			DonnéesZipé.CopyTo(this.DataZip, 0);		
    			this.DeComprime();
    		}
     
    		private bool DeComprime () {
    			MemoryStream StreamZip = new MemoryStream();
    			int position;
    			byte [] tailleoctet = new byte[4];
    			GZipStream DeZip = new GZipStream( StreamZip, CompressionMode.Decompress, false);
    			StreamZip.Write(DataZip, 0, DataZip.Length);
    			position = Convert.ToInt32(StreamZip.Length -4 );
    			StreamZip.Position = position;
    			StreamZip.Read (tailleoctet, 0, 4);
    			StreamZip.Position = 0;
    			byte [] DataUnZip = new byte[BitConverter.ToInt32(tailleoctet,0)+100];
    			int offset = 0;
    			while (true) {
    				int decompression = DeZip.Read(DataUnZip, offset, 100 );
    				if (decompression == 0 ) {
    					break;
    				}
    				offset += decompression;
    			}
    			DeZip.Flush();
    			DeZip.Close();
     
     
    			this.StreamXml.SetLength(DataUnZip.Length);
    			this.StreamXml.Write(DataUnZip, 0, DataUnZip.Length);
     
    			return true;
    		}
     
     
    	}
    }
    A+

    Renaud

Discussions similaires

  1. Classe pour la création d'un graphe xy
    Par Bob dans le forum MFC
    Réponses: 24
    Dernier message: 03/12/2009, 17h20
  2. Réponses: 31
    Dernier message: 30/03/2006, 16h57
  3. Élaboration de classe
    Par il_a_ri dans le forum Langages de programmation
    Réponses: 6
    Dernier message: 16/01/2003, 14h22
  4. Variable d'une Classe Ancêtre
    Par Génie dans le forum Langage
    Réponses: 3
    Dernier message: 18/09/2002, 19h24
  5. Sortir un typedef d'une classe
    Par Theophil dans le forum C++Builder
    Réponses: 13
    Dernier message: 03/07/2002, 17h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo