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 :

DecodeString ne fonctionne pas sur XE8..?


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 42
    Par défaut DecodeString ne fonctionne pas sur XE8..?
    Bonjour,

    Je rencontre un problème pour décoder une image en base64.
    Ma fonction marche avec Delphi XE5 mais pas XE8, une idée ?

    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
    procedure TForm4.Button1Click(Sender: TObject);
    var
      Data: string;
      Stream: TMemoryStream;
    begin
      Data := '/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a'
        +'HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy'
        +'MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkACIDASIA'
        +'AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA'
        +'AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3'
        +'ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm'
        +'p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA'
        +'AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx'
        +'BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK'
        +'U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3'
        +'uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+uA+'
        +'JniDVNBtrA6ZO0RlMnmMqg9NuOoPrXf1zXiTR7fW9Q0y1uN+0GWRtuPugD19ytTOLlFpG+FqQp1l'
        +'OorpdPkeYeDvHXiPUvEFla3V+8sMlwqSAxryCfpxXulcMfBuk6Hq2mXdqsqIboK3Ixkqdp4H97aK'
        +'7mppxlFPmdzfH16NaopUY8qsQ7m9D+FFTUVocOoVThj33kl2x3BlEcXso5J/E/yFcr4+8ZJ4XGm2'
        +'cZUXmpTmNS0ZkCIoyzFQRnqB17+1UpfHFg9u7DxTFBtGSfIVMf8AfQNAHcX1qLy0eEna2QyP/dcH'
        +'Kn8CBU0LmWJWI2t/Evoe4rzzT/HmmzTFP+Ewt7ggZ2gRN/6CtT2Xj62PjGw0l7pJ4L9XSKdYSmJR'
        +'yASTzkZA4oHY9BooooEeEfFbzm+I0MrRu8UOlr5eBkAmRt349K831idW024jXIcxnO4Efzr134jx'
        +'STePdPjQombMl2Y4CqNxJPsAP0rh9a0G+ku/IhsZ5oyQoPkkFmIzjHPIrGVdxbVtD3sPk0K9KE/a'
        +'cravr627nmXh25+y6n5h7rjHryK9Bju3ub/Smt45vOh1C3liYIeCHH9M1Da+GykRuroJZRAFl3x5'
        +'Zh6genbJxk8euOn0qwS28TaPEbpbhmk3CNYiuFI4Jz356dqXt29LFvI4xi5OpeyeyfTzPoWiiitz'
        +'54818WwWt14vaA3KQai+nxm0Mj7Uc+ZJlckEA/dPTnFcXf6pqejWVzb6hpdzbXwXyknkjDJtyx4I'
        +'wOsh6ZHA44qD41602neOobeaCJ4ZdNjKM2QUPmPkgj6VwsXjC6hg2x6leRpjGxLg4/IGuWrGV3ZH'
        +'1GXVsM6MYzmtOj0+59vJo7keI9KuL3zI9JkmijeJI1MI+WIcMvBPOMAHuM8DJzsWTS6x4p0y7ikg'
        +'jSFwPIluFMz5b5n2jp9DivIX8Rx3L4kuJpj/ANNCT/Ougt/F7az428NpBbrDItza2u1ZM5xKOeOO'
        +'c9KmMZt6o6MVXwlOH7uavZre/T9T6o5oqSiu258efO/7StkE1Lw/fAcyRTQk/wC6VI/9DNeMZBhG'
        +'PSveP2lLiEaf4ftzgzmWZx7KAoP6kflXgif6gfSkNBF1rrfhRYnUvitoiEZWOczH28tSw/UCuSh5'
        +'Neg/AiaGH4p2yzEB5LeZI8/3sZ/kDQI+saKKKAPmn4835tviPaefAk0K6agVW7ZeTJFebXVxp09h'
        +'IYLcRykcYUf0r2v9orw5NcafpviC3jZxalre4IGdqtypPtnI/EV4QdL1K20v+0nsrlbF5PKE7RkR'
        +'s3PAboTwaBkeltAtwTcxl48dMZ7iuq8GXcEnxF8Of2faiDbqMILg8kFgCPyJrlrLT7/UxOLCznn8'
        +'iLzZfKjLFVyBk46DkV6D8EfDtzqvj22uzA32WwHnyyFeAcfKM+pJB+gNAH1bRRRQIY6rIu11DKw5'
        +'BGQazNc0DTfEWjy6RqVuJbOYYKD5cYPBBHQiiigCh4V8DaD4LiuI9FtWiNwQ0ju5djjoMnt14963'
        +'4oIoA3kxJHu+ZtqgZPqaKKEBNRRRQB//2Q==';
     
      Stream := TStringStream.Create(Soap.EncdDecd.DecodeString(Data));
      try
        Image1.Bitmap.LoadFromStream(Stream);
      finally
        Stream.Free;
      end;
    end;
    Merci.

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    409
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 409
    Par défaut
    tu as quoi exactement comme résultat ? "cela ne marche pas" n'est pas franchement très parlant

    tu peux t'inspirer de ça et ça

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 42
    Par défaut
    Bonjour oui effectivement ma description du problème laisse à désirer
    Voici l'exception qui survient :
    Nom : Capture2.PNG
Affichages : 612
Taille : 13,3 Ko

    Je regarde les liens dans l'aprem.
    Merci

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 081
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TForm4.Button1Click(Sender: TObject);
    var
      Data: String;
      Stream: TMemoryStream;
    begin
      Data := '/9j/...... bla bla';
     
      Stream := TStringStream.Create(Soap.EncdDecd.DecodeString(Data), TEncoding.ANSI);
      try
        Image1.Bitmap.LoadFromStream(Stream);
      finally
        Stream.Free;
      end;
    end;
    A savoir que Soap.EncdDecd.DecodeString va utiliser aussi des TStringStream donc le mieux serait d'écrire ceci pour garantir un DecodeStream sur un binaire en non une chaine soumise à un CharSet

    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
    procedure TForm4.Button1Click(Sender: TObject);
    var
      Data: String;
      Stream, StreamDecoded: TMemoryStream;
    begin
      Data := '/9j/...... bla bla';
     
      Stream := TStringStream.Create(Data);
      try
        StreamDecoded := TMemoryStream.Create();
        try
          //Soap.EncdDecd.DecodeStream(Stream, StreamDecoded);
          System.NetEncoding.TNetEncoding.Base64.Decode(Stream, StreamDecoded);
          Image1.Bitmap.LoadFromStream(StreamDecoded);
        finally
          StreamDecoded.Free();
        end;
      finally
        Stream.Free;
      end;
    end;
    Depuis XE7, TNetEncoding.Base64.Encode remplace Soap.EncdDecd.DecodeString

    Le code a complètement été réécrit !
    La classe TBase64Encoding n'utilise plus de AnsiChar mais plutôt du Byte pour éviter ces soucis de CharSet et de taille du Char
    Le Base64 étant par définition un ensemble de caractères réduits dans l'ANSI

    Il semble malheureusement que cette réécriture souffre de problème de compatibilité
    Dommage, ils sont juste mis un commentaire dans le code source de Soap.EncdDecd.pas, un warning deprecated aurait pu t'alerter qu'il fallait repenser le code
    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

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 42
    Par défaut
    Merci ShaiLeTroll ta solution fonctionne.

    J'en ai fait une petite fonction :
    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
    procedure LoadImageFromData(ABitmap: TBitmap; AData: string);
    var
      EncdStream: TMemoryStream;
      DecdStream: TMemoryStream;
    begin
      EncdStream := TStringStream.Create(AData);
      try
        DecdStream := TMemoryStream.Create;
        try
          TNetEncoding.Base64.Decode(EncdStream, DecdStream);
          ABitmap.LoadFromStream(DecdStream);
        finally
          DecdStream.Free;
        end;
      finally
        EncdStream.Free;
      end;
    end;
    J'avais bien essayé de modifier l'encodage du TStringStream mais sans succès...

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

Discussions similaires

  1. Requete qui ne fonctionne pas sur toutes les versions de MySQL
    Par goldorax113 dans le forum Requêtes
    Réponses: 2
    Dernier message: 06/06/2006, 11h04
  2. Réponses: 4
    Dernier message: 03/04/2006, 08h50
  3. Réponses: 7
    Dernier message: 10/02/2006, 18h00
  4. TXMLDocument, ne fonctionne pas sur tous les PC
    Par Neilos dans le forum C++Builder
    Réponses: 4
    Dernier message: 05/10/2005, 22h33
  5. Code qui ne fonctionne pas sur Mac
    Par malbaladejo dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 14/01/2005, 11h08

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