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

Framework .NET Discussion :

[2.0] Pourquoi manque-t-il le dernier byte avec GZipStream ?


Sujet :

Framework .NET

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 12
    Points : 11
    Points
    11
    Par défaut [2.0] Pourquoi manque-t-il le dernier byte avec GZipStream ?
    Bonjour à tous,

    Je manipule des fichier XML dans mon application. Pour les stocker en base je les converti en base 64 puis je les compresse. Voici ma fonction qui me permet de faire l'opération inverse (décompression puis décode base 64):

    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
     
    // Convert byte[] to MemoryStream, xCblBodyB64GZip (byte[]) contient
     ce qui est stocké en base
    MemoryStream xCblBodyB64GZipMemoryStream = new MemoryStream
    (xCblBodyB64GZip);
     
    GZipStream xCblBodyB64GzipStream = new GZipStream
     (xCblBodyB64GZipMemoryStream, CompressionMode.Decompress);
    // Uncompress GZipStream in byte[1024] and store them in MemoryStream
    MemoryStream xCblBodyB64MemoryStream = new MemoryStream ();
    byte[] buffer = new byte[1024];
    int readBytes;
    // On lit des paquets de 1024 bytes dans buffer puis on les mets les uns à
     la suite des autres dans un MemoryStream.
    while ((readBytes = xCblBodyB64GzipStream.Read (buffer, 0,
     buffer.Length)) > 0)
        xCblBodyB64MemoryStream.Write (buffer, 0, readBytes);
    xCblBodyB64MemoryStream.Position = 0;
     
    // Convert from MemoryStream to byte[]
    byte[] xCblBodyB64BytesArray = new byte[xCblBodyB64MemoryStream.Length];
    xCblBodyB64MemoryStream.Read (xCblBodyB64BytesArray, 0,
     xCblBodyB64BytesArray.Length);
     
    // Convert byte[] to base 64
    string xCblBodyB64 = System.Text.Encoding.UTF8.GetString
     (xCblBodyB64BytesArray);
     
    // Convert base 64 to byte[]
    byte[] xCblBodyBytesArray = Convert.FromBase64String (xCblBodyB64);
     
    // Convert from byte[] to string
    xCblBody = System.Text.Encoding.UTF8.GetString (xCblBodyBytesArray);
    Jusqu'à la boucle, tout se passe bien. La chaine compressée est bien la même que celle que j'ai obtenu avant de l'enregistrer en base.
    La boucle lit des paquets de 1024 bytes et les enregistre dans un memory stream. Le résultat de la décompression est bien identique à ce que j'avais avant compression SAUF le dernier byte qui a disparu ...
    readBytes me donne une unité de moins que ce qu'il devrait et le tableau buffer ne contient pas le dernier byte attendu.

    Avez-vous une idée?

    Merci d'avance

  2. #2
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Salut

    C'est ici que ça cloche?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // On lit des paquets de 1024 bytes dans buffer puis on les mets les uns à
     la suite des autres dans un MemoryStream.
    while ((readBytes = xCblBodyB64GzipStream.Read (buffer, 0,
     buffer.Length)) > 0)
        xCblBodyB64MemoryStream.Write (buffer, 0, readBytes);

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    oui c'est ça. A chaque itération je répère des paquets de 1024 bytes. Et à la dernière il en manque 1...

  4. #4
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Le code semble correct. Il y aurait donc un problème avec les données.

    Comment fais tu pour savoir que la chaine compressée est la même que celle avant enregistrement dans la base?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    avec le debugueur de VS.NET. Comme mes chaines sont assez longues j'ai regardé les longueurs (qui sont identiques) et les premiers et derniers caractères de la chaine.
    Idem pour les chaines décompressées, celle avant compression fait 1 caractère de plus. Les caractères de début et de fin sont les mêmes sauf le dernier qui manque dans la chaine après décompression...

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 12
    Points : 11
    Points
    11

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WS 2008 R2] (Question de débutant) Pourquoi éteindre un AD en dernier
    Par FreeDo dans le forum Windows Serveur
    Réponses: 4
    Dernier message: 14/08/2013, 17h05
  2. Recuperer dernier ID avec IDENTITY_VAL_LOCAL()
    Par Mercenary Developer dans le forum DB2
    Réponses: 2
    Dernier message: 25/06/2007, 11h13
  3. [JavaScript] [FAQ] Pourquoi mon script JS ajouté à ma page avec innerHTML ne marche-t-il pas ?
    Par FremyCompany dans le forum Contribuez
    Réponses: 6
    Dernier message: 05/03/2007, 20h44
  4. [MySQL] Récupération du dernier incrément avec mysql_insert_id()
    Par lodan dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 06/02/2007, 11h40
  5. [cURL] Tester le temps de la dernière requête avec cURL
    Par brasco06 dans le forum Bibliothèques et frameworks
    Réponses: 16
    Dernier message: 13/10/2006, 17h11

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