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

Langage Delphi Discussion :

TNetEncoding.Base64.Encode et insertion de sauts de ligne


Sujet :

Langage Delphi

  1. #1
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 494
    Points : 3 129
    Points
    3 129
    Par défaut TNetEncoding.Base64.Encode et insertion de sauts de ligne
    Bonjour

    J'ai posté il y a quelques jours une question sur l'envoi en POST d'une chaîne qui se retrouvait modifiée côté PHP.
    Je pensais que ça venait de du format d'envoi de la requête et une solution trouvée sur le net a résolu le problème.
    Mais en fouillant un peu, je me suis aperçu que la source du problème ne vient pas de là mais de TNetEncoding.Base64.Encode.

    J'ai dans une constante F une chaîne de caractères composant un texte en JSON.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    G = 'ma chaine en JSON .......'; // un peu plus pertinente quand même :-)
    Passé en base64, ça donne la chaîne suivante/

    F = 'eyJkYXRhYmFzZSI6ICJtb2R1bHJfcGVsaWNhbl9hc3N1cmFuY2VzIiwidXNlcl9pZCI6ICIxIiwidGFncyI6IHsiMTE3ODYiOiAiZXN0aW1hdGU6NjcyIn0sIm1vZHVscnNjYW4iOiAibW9kdWxyc2Nhbjo6OWY3NjJlYTJmMWRmMmNjMGUxMTM2NGY1ZThkNWYxYmM4NjYzNjBlNiJ9'

    Si je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Memo1.Lines.Text := TNetEncoding.Base64.Encode(G);
    Je retrouve:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    eyJkYXRhYmFzZSI6ICJtb2R1bHJfcGVsaWNhbl9hc3N1cmFuY2VzIiwidXNlcl9pZCI6ICIxIiwi
    dGFncyI6IHsiMTE3ODYiOiAiZXN0aW1hdGU6NjcyIn0sIm1vZHVscnNjYW4iOiAibW9kdWxyc2Nh
    bjo6OWY3NjJlYTJmMWRmMmNjMGUxMTM2NGY1ZThkNWYxYmM4NjYzNjBlNiJ9
    Passée dans un éditeur héxadécimal on voit qu'il y a des x0Dx0A insérés dans la chaîne.

    Nom : 2019-11-18_140352.png
Affichages : 565
Taille : 25,4 Ko

    Une idée du pourquoi du comment ????



    Complément: Je viens de trouver dans l'unité System.NetEncoding qu'il y a une notion de longueur de ligne (nombre de caractères par ligne) dans TBase64Encoding.EncodeBytes : CharsPerLine

    Ceci doit expliquer cela mais je ne vois pas comment le modifier en utilisant directement TNetEncoding.Base64.Encode

  2. #2
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 494
    Points : 3 129
    Points
    3 129
    Par défaut
    Oui, je sais , je me réponds à moi-même
    Mais si ça peut éviter à d'autres de galérer comme moi aujourdhui ...

    La solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      Bs64 := TBase64Encoding.Create(0);   /// Indiquer 0 pour la longueur de ligne
      Memo1.Lines.Text := Bs64.Encode(G);
      Bs64.Free;
    Et là, bingo !

  3. #3
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 879
    Points : 11 377
    Points
    11 377
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    En lisant le paragraphe Variants summary table ici, on trouve la notion de césure des lignes tous les x caractères selon la norme de codage utilisée (76 pour ton exemple, a priori selon la norme MIME).

    Le site https://www.base64decode.org/ ne tient pas compte des sauts de ligne insérés et fournit le même résultat pour tes deux chaînes.

  4. #4
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 494
    Points : 3 129
    Points
    3 129
    Par défaut
    Effectivement, je retrouve la longueur de mes "blocs".

    Maintenant au moins, je sais d'où venait le problème.

    Merci pour le lien

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

Discussions similaires

  1. [MFC] Problème d'insertion du caractère ' dans une BD
    Par julien.nasser dans le forum MFC
    Réponses: 5
    Dernier message: 21/04/2006, 09h46
  2. Problème d'INSERT avec caractères accentués: mysql 5.0
    Par yizashi dans le forum Installation
    Réponses: 2
    Dernier message: 05/04/2006, 10h26
  3. [Encoding][String] remplacement de caractères ISO 8859-2
    Par srenaudo dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 23/03/2006, 12h06
  4. [SQL2]Insertion de caractères spéciaux
    Par willowII dans le forum Langage SQL
    Réponses: 4
    Dernier message: 26/10/2004, 15h33
  5. Bulk insert et caractère accentué
    Par slc dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 22/04/2003, 12h52

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