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

 Delphi Discussion :

Impossible de décompresser du texte Zlib


Sujet :

Delphi

  1. #1
    Membre habitué Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 233
    Points : 159
    Points
    159
    Par défaut Impossible de décompresser du texte Zlib
    Bonjour,

    J'ai un petit souci, je n'arrive pas à décompresser du texte.

    Auriez vous une petit idée ?

    Exemple :
    Il tombe encore des grêlons,
    Mais on sait bien que c'est pour rire.
    Quand les nuages se déchirent,
    Le ciel écume de rayons.

    Le vent caresse les bourgeons
    Si longuement qu'il les fait luire.
    Il tombe encore des grêlons,
    Mais on sait bien que c'est pour rire.

    Les fauvettes et les pinsons
    Ont tant de choses à se dire
    Que dans les jardins en délire
    On oublie les premiers bourdons.
    Il tombe encore des grêlons …
    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
    { Compression }
    function CompressTxt(Data: String): String;
    var
      DataInput, DataOutput: TStringStream;
      Compress: TZCompressionStream;
    begin
      Result := EmptyStr;
      DataInput := TStringStream.Create(Data);
      DataOutput := TStringStream.Create;
      try
        Compress := TZCompressionStream.Create(DataOutput);
        try
          Compress.CopyFrom(DataInput, DataInput.Size);
        finally
          Compress.Free;
        end;
        Result := DataOutput.DataString;
      finally
        DataInput.Free;
        DataOutput.Free;
      end;
    end;
     
    { Décompression }
    function DecompressTxt(Data: String): String;
    var
      DataInput, DataOutput: TStringStream;
      Decompress: TZDecompressionStream;
    begin
      Result := EmptyStr;
      DataInput := TStringStream.Create(Data);
      DataOutput := TStringStream.Create;
      try
        Decompress := TZDecompressionStream.Create(DataInput);
        try
          DataOutput.CopyFrom(Decompress, Decompress.Size);
        finally
          Decompress.Free;
        end;
        Result := DataOutput.DataString;
      finally
        DataInput.Free;
        DataOutput.Free;
      end;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Memo2.Text := CompressTxt(Memo1.Text);
      Memo3.Text := DecompressTxt(Memo2.Text);
    end;
    Merci

  2. #2
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 072
    Points
    1 072
    Par défaut
    Bonjour,

    comme la question manque de précisions on ne peut que deviner le problème.

    t'as de la chance je viens de retrouver ma boule de cristal

    trêve de plaisanterie, il n'y a qu'une chose qui me saute aux yeux dans ton code:

    le fait de passer le texte compressé dans un TMemo ne me semble pas être une bonne idée
    comme tous les caractères ne sont pas affichables ils seront purement et simplement supprimé ... donc problème à la décompression.

    je te propose donc de passer par une variable et ça devrait résoudre ton problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var
      aStr: string;
    begin
      aStr := CompressTxt(Memo1.Text);
      Memo2.Text := DecompressTxt(aStr);
    Cordialement,

    @+

  3. #3
    Membre habitué Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 233
    Points : 159
    Points
    159
    Par défaut
    Citation Envoyé par Cirec Voir le message
    trêve de plaisanterie, il n'y a qu'une chose qui me saute aux yeux dans ton code:

    le fait de passer le texte compressé dans un TMemo ne me semble pas être une bonne idée
    comme tous les caractères ne sont pas affichables ils seront purement et simplement supprimé ... donc problème à la décompression.
    Effectivement problème résolu , j'étais loin de m'imaginer que certains caractères pouvais être supprimé.

    Merci Cirec.

  4. #4
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    j'ajouterais qu'il est assez osé de stocker des données binaires dans un String, ça se faisait sans trop de problème jusqu'à Delphi 2009 qui a introduit les chaînes Unicode et le pages de code sur les AnsiString

    maintenant c'est généralement TBytes ou tout simplement un TMemoryStream qui est utilisé (voir un TBytesStream)
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 072
    Points
    1 072
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    j'ajouterais qu'il est assez osé de stocker des données binaires dans un String, ça se faisait sans trop de problème jusqu'à Delphi 2009 qui a introduit les chaînes Unicode et le pages de code sur les AnsiString

    maintenant c'est généralement TBytes ou tout simplement un TMemoryStream qui est utilisé (voir un TBytesStream)
    bonjour,

    oui c'est vrai c'est osé et là c'est une erreur de ma part due à de vielles habitudes tenaces
    en générale j'utilise le type AnsiString qui lui ne pose aucun problème et m'assure la compatibilité entre les versions de Delphi

    Bien que le choix d'utiliser le type string, dans ce cas, n'est pas de mon fait,
    j'aime bien utiliser cette "méthode", qui à mes yeux et dans certain cas,
    présente quelques avantages. (Pas besoin de libérer la mémoire, possibilité de faire une recherche avec Pos, PosEx ... )

    Alors oui on peut certainement faire autrement aujourd'hui avec Berlin ou Tokyo
    mais à l'époque, D4-D7, ça m'a bien facilité la tâche et ça reste fonctionnel.


    Cordialement,

    @+

  6. #6
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    Citation Envoyé par Cirec Voir le message
    bonjour,

    oui c'est vrai c'est osé et là c'est une erreur de ma part due à de vielles habitudes tenaces
    en générale j'utilise le type AnsiString qui lui ne pose aucun problème et m'assure la compatibilité entre les versions de Delphi

    Bien que le choix d'utiliser le type string, dans ce cas, n'est pas de mon fait,
    j'aime bien utiliser cette "méthode", qui à mes yeux et dans certain cas,
    présente quelques avantages. (Pas besoin de libérer la mémoire, possibilité de faire une recherche avec Pos, PosEx ... )

    Alors oui on peut certainement faire autrement aujourd'hui avec Berlin ou Tokyo
    mais à l'époque, D4-D7, ça m'a bien facilité la tâche et ça reste fonctionnel.


    Cordialement,

    @+
    j'ai longuement cherché à convaincre Embarcadero de cela sans succès TBytes est loin d'offrir tout le confort dans anciennes string.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 429
    Points : 24 794
    Points
    24 794
    Par défaut
    Je préfère RawByteString à AnsiString, c'est juste un Alias je trouve encore plus clair quand on est obligé de passer par une chaine pour une opération sur un binaire avec une veille fonction.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/12/2017, 17h08
  2. Réponses: 3
    Dernier message: 28/11/2010, 20h56
  3. [MySQL] Insertion lorsque le texte comporte des guillemets
    Par guichsp dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 15/09/2007, 14h32
  4. Réponses: 1
    Dernier message: 29/08/2006, 15h45
  5. [Tool Tip Text]Lien qui affiche des infos sans cliquer !
    Par Melchisedec dans le forum Général Conception Web
    Réponses: 2
    Dernier message: 08/06/2006, 15h14

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