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 :

Encoder une image JPG en ASCII Base 64


Sujet :

Langage Delphi

  1. #1
    Membre expérimenté
    Avatar de Harry
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2002
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 224
    Points : 1 331
    Points
    1 331
    Par défaut Encoder une image JPG en ASCII Base 64
    Bonjour,


    Je dois encoder une image en Base 64 pour effectuer un transfert vers un webservice en XML.

    Comment faire ??

    Merci

    Attention le .NET sur PDA peut causer des chutes de cheveux

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 298
    Points : 318
    Points
    318
    Par défaut
    En utilisant une fonction encode64 qui doit être disponible avec les composants XML ou ça (en le modifiant pour utiliser un stream): http://www.swissdelphicenter.ch/torry/showcode.php?id=1524

  3. #3
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 152
    Points
    10 152
    Par défaut
    En gros, tu enregistres ton image dans un TMemoryStream.
    Ensuite, tu récupère le contenu de celui par 3 octets, que tu stocke chaque fois dans un LongWord (4ème octet à 0 bien entendu).
    Après, tu fais qutre and binaires pour récupérer les 24 bits par 6 (6 bits = base 64).
    Tu n'as plus qu'à stocker ces 6 bits dans un Byte (deux derniers bits à 0) et finalement récupérer le Xème caractère d'une chaîne de 64 caractère contenant les caractères de ta base.

    Attention : après avoir récupéré les 3 octets, tu dois les inverser pour obtenir le format Big Endian.

    Au niveau du code, ça devrait donner quelque chose comme ça :
    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
    function StreamToBase64(Stream : TStream) : string;
    type
      TTroisOctets = record // A cause du format Big Endian
        case integer of
          0 : (Int : LongWord);
          1 : (Bytes : array[0..3] of Byte);
      end;
    const
      Base64 : string = '01234567789ABCDEFGH...'; // tu dois avoir 64 caractères
    var TroisOctets : record;
        SixBits : Byte;
    begin
      Stream.Seek(0, soFromBeginning);
      Result := '';
      while Stream.Position < Stream.Size do
      begin
        Stream.ReadBuffer&#40;TroisOctets, 3&#41;;
        // Ici on va renverser les quatre octets de TroisOctets
        TroisOctets.Bytes&#91;3&#93; &#58;= TroisOctets.Bytes&#91;0&#93;;
        TroisOctets.Bytes&#91;0&#93; &#58;= TroisOctets.Bytes&#91;1&#93;;
        TroisOctets.Bytes&#91;1&#93; &#58;= TroisOctets.Bytes&#91;2&#93;;
        TroisOctets.Bytes&#91;2&#93; &#58;= TroisOctets.Bytes&#91;0&#93;;
        TroisOctets.Bytes&#91;0&#93; &#58;= 0;
        // Fin du renversement
        SixBits &#58;= Byte&#40;TroisOctets.Int and 63&#41;; // bits 0-5
        Result &#58;= Result+Base64&#91;SixBits&#93;;
        SixBits &#58;= Byte&#40;&#40;TroisOctets.Int and 4032&#41; shr 6&#41;; // bits 6-11
        Result &#58;= Result+Base64&#91;SixBits&#93;;
        SixBits &#58;= Byte&#40;&#40;TroisOctets.Int and 258048&#41; shr 12&#41;; // bits 12-17
        Result &#58;= Result+Base64&#91;SixBits&#93;;
        SixBits &#58;= Byte&#40;&#40;TroisOctets.Int and 16515072&#41; shr 16&#41;; // bits 18-23
        Result &#58;= Result+Base64&#91;SixBits&#93;;
      end;
    end;
    Tu noteras qu'avant l'appel à cette fonction, tu dois vérifier que ton stream possède bien un multiple de 3 octets. Si ce n'est pas le cas, tu dois ajouter les 0 manquant au début.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  4. #4
    Membre expérimenté
    Avatar de Harry
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2002
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 224
    Points : 1 331
    Points
    1 331
    Par défaut
    Merci à vous deux, je pense que la méthode de sjrd me semble la plus aproprié, je vais donc tester cette méthode la (t'inquietes pas cpdump, j'avais commencé à transformer la fonction de Torry, mais c'était pas gagné ).

    juste quelques questions ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TTroisOctets = record // A cause du format Big Endian
        case integer of
          0 &#58; &#40;Int &#58; LongWord&#41;;
          1 &#58; &#40;Bytes &#58; array&#91;0..3&#93; of Byte&#41;;
      end;
    je comprend pas comment ca marche, en plus on peu pas declarer des array dans un record [EDIT] ahh, ben non ca passe si il y a pas de case, GG le compilo pr le message [/EDIT]
    Bon, ca mis a part, ce que je pige pas c'est comment il trouve la valeur de 'integer' (case integer of...).

    Si tu peux m'éclairer, merci.

    Attention le .NET sur PDA peut causer des chutes de cheveux

  5. #5
    Membre expérimenté
    Avatar de Harry
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2002
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 224
    Points : 1 331
    Points
    1 331
    Par défaut
    Voila, je me suis permis d'interpréter ton code comme suit :

    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
    function TMenuPrincipal.StreamToBase64&#40;Stream &#58; TStream&#41; &#58; string;
    type
     
      TTroisOctets = record // A cause du format Big Endian
         Int &#58; LongWord;
         Bytes &#58; array&#91;0..3&#93; of Byte;
      end;
     
    var TroisOctets &#58; TTroisOctets;
        SixBits &#58; Byte;
        Bytez &#58; array&#91;0..3&#93; of Byte;
    const
        Base64 &#58; string = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/';
    begin
      Stream.Seek&#40;0, soFromBeginning&#41;;
      Result &#58;= '';
      while Stream.Position < Stream.Size do
      begin
        Stream.ReadBuffer&#40;TroisOctets.Bytes, 3&#41;;
        // Ici on va renverser les quatre octets de TroisOctets
        TroisOctets.Bytes&#91;3&#93; &#58;= TroisOctets.Bytes&#91;0&#93;;
        TroisOctets.Bytes&#91;0&#93; &#58;= TroisOctets.Bytes&#91;1&#93;;
        TroisOctets.Bytes&#91;1&#93; &#58;= TroisOctets.Bytes&#91;2&#93;;
        TroisOctets.Bytes&#91;2&#93; &#58;= TroisOctets.Bytes&#91;0&#93;;
        TroisOctets.Bytes&#91;0&#93; &#58;= 0;
        // Fin du renversement
        SixBits &#58;= Byte&#40;TroisOctets.Int and 63&#41;; // bits 0-5
        Result &#58;= Result+Base64&#91;SixBits&#93;;
        SixBits &#58;= Byte&#40;&#40;TroisOctets.Int and 4032&#41; shr 6&#41;; // bits 6-11
        Result &#58;= Result+Base64&#91;SixBits&#93;;
        SixBits &#58;= Byte&#40;&#40;TroisOctets.Int and 258048&#41; shr 12&#41;; // bits 12-17
        Result &#58;= Result+Base64&#91;SixBits&#93;;
        SixBits &#58;= Byte&#40;&#40;TroisOctets.Int and 16515072&#41; shr 16&#41;; // bits 18-23
        Result &#58;= Result+Base64&#91;SixBits&#93;;
      end;
    end;
    Comme ca ca compile mais je ne sais pas si je fais une bétise en virant le case.

    Merci, si ca marche je mettrai en résolu, en att je teste.

    A dans quelques minutes

    Attention le .NET sur PDA peut causer des chutes de cheveux

  6. #6
    Membre expérimenté
    Avatar de Harry
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2002
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 224
    Points : 1 331
    Points
    1 331
    Par défaut
    Erg, ca bloque sur la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Result &#58;= Result+Base64&#91;SixBits&#93;;
    La première.

    le message c'est :
    Index was outside the bounds of the array
    SixBits vaut 0 à ce moment la

    Merci,

    Attention le .NET sur PDA peut causer des chutes de cheveux

  7. #7
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 152
    Points
    10 152
    Par défaut
    Citation Envoyé par Harry
    juste quelques questions ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TTroisOctets = record // A cause du format Big Endian
      case integer of
        0 &#58; &#40;Int &#58; LongWord&#41;;
        1 &#58; &#40;Bytes &#58; array&#91;0..3&#93; of Byte&#41;;
    end;
    je comprend pas comment ca marche, en plus on peu pas declarer des array dans un record [EDIT] ahh, ben non ca passe si il y a pas de case, GG le compilo pr le message [/EDIT]
    Bon, ca mis a part, ce que je pige pas c'est comment il trouve la valeur de 'integer' (case integer of...).

    Si tu peux m'éclairer, merci.
    C'est une construction qui permet d'avoir deux suites de champs qui sont enregistrés au même endroit. Donc si tu modifies Int, les Bytes seront modifiés aussi et vice versa. En fait Bytes[0] à la même adresse que Int

    Tu dis qu'on ne peut pas mettre de tableau dans un record, c'est faux ; j'en suis absolument certain.
    Par contre il ne faut surtout pas supprimer le case integer of, car dans mon code je me base justement sur let fait que Int et Bytes ont même adresse.

    Es-tu certain que le compilo n'accepte pas le code tel que je l'ai écrit ? Si c'est bien le cas peux-tu me dire quel est le message exact du compilo et à quel endroit ?

    Pour ce qui est de la valeur de integer, il s'en fout. C'est la construction qui impose ce truc. En fait tu pourrais aussi bien mettre n'importe quel type ordinal (donc pas de chaîne), en adaptant les valeurs possibles. Tu peux même mettre boolean avec True et False !

    Voilà j'espère que j'ai été clair sinon n'hésite pas à poser d'autres questions .
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  8. #8
    Membre expérimenté
    Avatar de Harry
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2002
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 224
    Points : 1 331
    Points
    1 331
    Par défaut
    J'ai repris ton code d'origine et j'ai juste complété la chaine de 64 caractères et le compilateur s'arrete sur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1 &#58; &#40;Bytes &#58; array&#91;0..3&#93; of Byte&#41;;
    Avec le message
    [Erreur] Menu.pas(1040): E2418 Le type 'Array' nécessite une initialisation - interdite dans un enregistrement variant
    Voila, j'espere que tu pourras m'aider.

    Merci,

    A ++
    [Edit] Remarque : je travaille sous Delphi 2005 en VCL, j'ai essaye ton code sous Delphi 4 et il compile après avoir modifié la declaration de variables comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var TroisOctets &#58; TTroisOctets;
        SixBits &#58; Byte;
    [/Edit]

    Attention le .NET sur PDA peut causer des chutes de cheveux

  9. #9
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 152
    Points
    10 152
    Par défaut
    Citation Envoyé par Harry
    [Edit] Remarque : je travaille sous Delphi 2005 en VCL, j'ai essaye ton code sous Delphi 4 et il compile après avoir modifié la declaration de variables comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var TroisOctets &#58; TTroisOctets;
        SixBits &#58; Byte;
    [/Edit]
    erreur d'inattention En effet c'est TTroisOctets le type.
    Apparemment c'est une évolution du langage sour D2005. C'est vrai que j'ai pas encore utilisé cette syntaxe sour D2005.
    Je te propose ceci alors :
    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
    function StreamToBase64&#40;Stream &#58; TStream&#41; &#58; string;
    type
      TTroisOctets = record // A cause du format Big Endian
        case integer of
          0 &#58; &#40;Int &#58; LongWord&#41;;
          1 &#58; &#40;Byte0, Byte1, Byte2, Byte3 &#58; Byte&#41;;
      end;
    const
      Base64 &#58; string = '01234567789ABCDEFGH...'; // tu dois avoir 64 caractères
    var TroisOctets &#58; TTroisOctets;
        SixBits &#58; Byte;
    begin
      Stream.Seek&#40;0, soFromBeginning&#41;;
      Result &#58;= '';
      while Stream.Position < Stream.Size do
      begin
        Stream.ReadBuffer&#40;TroisOctets, 3&#41;;
        // Ici on va renverser les quatre octets de TroisOctets
        TroisOctets.Byte3 &#58;= TroisOctets.Byte0;
        TroisOctets.Byte0 &#58;= TroisOctets.Byte1;
        TroisOctets.Byte1 &#58;= TroisOctets.Byte2;
        TroisOctets.Byte2 &#58;= TroisOctets.Byte0;
        TroisOctets.Byte0 &#58;= 0;
        // Fin du renversement
        SixBits &#58;= Byte&#40;TroisOctets.Int and 63&#41;; // bits 0-5
        Result &#58;= Result+Base64&#91;SixBits&#93;;
        SixBits &#58;= Byte&#40;&#40;TroisOctets.Int and 4032&#41; shr 6&#41;; // bits 6-11
        Result &#58;= Result+Base64&#91;SixBits&#93;;
        SixBits &#58;= Byte&#40;&#40;TroisOctets.Int and 258048&#41; shr 12&#41;; // bits 12-17
        Result &#58;= Result+Base64&#91;SixBits&#93;;
        SixBits &#58;= Byte&#40;&#40;TroisOctets.Int and 16515072&#41; shr 16&#41;; // bits 18-23
        Result &#58;= Result+Base64&#91;SixBits&#93;;
      end;
    end;
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  10. #10
    Membre expérimenté
    Avatar de Harry
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2002
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 224
    Points : 1 331
    Points
    1 331
    Par défaut
    Merci, ca accepte la déclaration de variables come ca

    Par contre je suis coincé sur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Stream.ReadBuffer&#40;TroisOctets, 3&#41;;
    Le message rendu par le compilateur est :
    [Erreur] Menu.pas(1051): E2250 Aucune version surchargée de 'ReadBuffer' ne peut être appelée avec ces arguments
    Merci,

    Et désolé de te faire debugger comme ca , mais l'aide de delphi 2005 est un peu embrouillé du fait du mélange de languages et en plus orienté fortement vers le C#.

    Attention le .NET sur PDA peut causer des chutes de cheveux

  11. #11
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 152
    Points
    10 152
    Par défaut
    Aïe. Ca c'est vraiment bizarre
    Essaye ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Stream.ReadBuffer&#40;@TroisOctets, 3&#41;;
    Et si pas ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Stream.ReadBuffer&#40;TroisOctets^, 3&#41;;
    Mais j'ai aucune garantie

    Au pire, ajoute une variable de type LongWord comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function StreamToBase64&#40;Stream &#58; TStream&#41; &#58; string;
    ...
    var LgWord &#58; LongWord;
        TroisOctets &#58; TTroisOctets;
        SixBits &#58; Byte;
    begin
      ...
      while Stream.Position < Stream.Size do
      begin
        Stream.ReadBuffer&#40;LgWord, 3&#41;;
        TroisOctets.Int &#58;= LgWord;
        ...
      end;
    end;
    end;
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  12. #12
    Membre expérimenté
    Avatar de Harry
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2002
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 224
    Points : 1 331
    Points
    1 331
    Par défaut
    Yess, on y est presque, tes 2 premiers idées ne passent pas, par contre le 'Au pire' lui, ca marche niquel (mais pourquoi j'y ai pas pensé ), enfin ca compile niquel.

    Lors de l'execution le code s'arrete sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Result &#58;= Result+Base64&#91;SixBits&#93;;
    (le premier)

    avec comme message d'erreur :
    Index was outside bounds of the array
    Merci,


    A++

    Attention le .NET sur PDA peut causer des chutes de cheveux

  13. #13
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 152
    Points
    10 152
    Par défaut
    Arf ! Idiot que je suis !

    Il faut mettre Base64[SixBits+1]

    On va y arriver
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  14. #14
    Membre expérimenté
    Avatar de Harry
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2002
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 224
    Points : 1 331
    Points
    1 331
    Par défaut
    Merci

    Ca marche presque, juste ca bloque au dernier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Result &#58;= Result+Base64&#91;SixBits +1&#93;;
    Avec le meme message.

    Mais c'est peut etre de ma faute! voici le code que j'ai fait pour ajouter le 0 devant pour que le stream soit un multiple de 3 en longeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    decal &#58;= 0;
      streambis &#58;= TMemoryStream.Create;
        if &#40;i mod 3&#41; > 0 then begin
            streambis.Write&#40;decal,sizeof&#40;decal&#41;&#41;;
            streambis.CopyFrom&#40;Stream, 0&#41;;
            stream &#58;= streambis;
      end;
    decal est un byte avec 0 dedans.

    je sais pas pourquoi mais j'ai l'impression de chercher midi a 14h

    Merci

    Attention le .NET sur PDA peut causer des chutes de cheveux

  15. #15
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 152
    Points
    10 152
    Par défaut
    Citation Envoyé par Harry
    je sais pas pourquoi mais j'ai l'impression de chercher midi a 14h
    Avec le décalage de streams, il faut
    Mais je te conseille plutôt ce code-ci :
    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
    var Zero &#58; integer;
        StreamBis &#58; TStream;
    ...
    Zero &#58;= 0;
    if Stream.Size mod 3 > 0 then
    begin
      StreamBis &#58;= TMemoryStream.Create;
      try
        StreamBis.Write&#40;Zero, 3 - Stream.Size mod 3&#41;;
        StreamBis.CopyFrom&#40;Stream, 0&#41;;
        Stream.Seek&#40;0, soFromBeginning&#41;;
        Stream.CopyFrom&#40;StreamBis, 0&#41;;
      finally
        StreamBis.Free;
      end;
    end;
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  16. #16
    Membre expérimenté
    Avatar de Harry
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2002
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 224
    Points : 1 331
    Points
    1 331
    Par défaut
    Ok, en fait le problème persiste, voici le code dans son état actuel :

    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    function TMenuPrincipal.StreamToBase64&#40;Stream &#58; TStream&#41; &#58; string;
    type
      TTroisOctets = record // A cause du format Big Endian
        case integer of
          0 &#58; &#40;Int &#58; LongWord&#41;;
          1 &#58; &#40;Byte0, Byte1, Byte2, Byte3 &#58; Byte&#41;;
      end;
    const
      Base64 &#58; string = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/'; //64 caractères
    var TroisOctets &#58; TTroisOctets;
        SixBits &#58; Byte;
        LgWord &#58; LongWord;
        i, Zero &#58; integer;
        Streambis &#58; TStream;
     
    begin
        Zero &#58;= 0;
        if Stream.Size mod 3 > 0 then
        begin
          StreamBis &#58;= TMemoryStream.Create;
          try
            i &#58;= &#40;3 - &#40;Stream.Size mod 3&#41;&#41;;
            StreamBis.Write&#40;Zero, i&#41;;
            StreamBis.CopyFrom&#40;Stream, 0&#41;;
            Stream.Seek&#40;0, soFromBeginning&#41;;
            Stream.CopyFrom&#40;StreamBis, 0&#41;;
          finally
            StreamBis.Free;
          end;
        end;
        i &#58;= stream.Size;
        Showmessage&#40;IntToStr&#40;i&#41;&#41;;
     
        Stream.Seek&#40;0, soFromBeginning&#41;;
        Result &#58;= '';
        while Stream.Position < Stream.Size do
        begin
            Stream.ReadBuffer&#40;LgWord, 3&#41;;
            TroisOctets.Int &#58;= LgWord;
            // Ici on va renverser les quatre octets de TroisOctets
            TroisOctets.Byte3 &#58;= TroisOctets.Byte0;
            TroisOctets.Byte0 &#58;= TroisOctets.Byte1;
            TroisOctets.Byte1 &#58;= TroisOctets.Byte2;
            TroisOctets.Byte2 &#58;= TroisOctets.Byte0;
            TroisOctets.Byte0 &#58;= 0;
            // Fin du renversement
            SixBits &#58;= Byte&#40;TroisOctets.Int and 63&#41;; // bits 0-5
            Result &#58;= Result+Base64&#91;SixBits +1&#93;;
            SixBits &#58;= Byte&#40;&#40;TroisOctets.Int and 4032&#41; shr 6&#41;; // bits 6-11
            Result &#58;= Result+Base64&#91;SixBits +1&#93;;
            SixBits &#58;= Byte&#40;&#40;TroisOctets.Int and 258048&#41; shr 12&#41;; // bits 12-17
            Result &#58;= Result+Base64&#91;SixBits +1&#93;;
            SixBits &#58;= Byte&#40;&#40;TroisOctets.Int and 16515072&#41; shr 16&#41;; // bits 18-23
            Result &#58;= Result+Base64&#91;SixBits +1&#93;;
        end;
    end;

    A l'execution ca plante sur la dernière ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Result &#58;= Result+Base64&#91;SixBits +1&#93;;
    avec comme message :
    Index was outside bounds of the array
    Merci pour tout

    Attention le .NET sur PDA peut causer des chutes de cheveux

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 298
    Points : 318
    Points
    318
    Par défaut
    Est ce que tu utilises un composant xml pour gérer tes fichiers xml ? parce les fonctions encode64 sont intégrés dans les compostants xml. Ca serais plus rapide que de perder son temps à chercher un bug dans le code ta fonction.

  18. #18
    Membre expérimenté
    Avatar de Harry
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2002
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 224
    Points : 1 331
    Points
    1 331
    Par défaut
    J'utilise le composant TXMLDocument, mais c'est une photo que je veux encoder en base 64.
    Et je n'ai pas trouvé la moindre méthode pour encoder en Base 64 avec ce composant

    Si il y en a un bien caché je suis toute ouie

    Attention le .NET sur PDA peut causer des chutes de cheveux

  19. #19
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 298
    Points : 318
    Points
    318
    Par défaut
    Généralement les composants xml ont des fonction encode/decode64 puisque c'est le moyen de stocker les infos binaires. C'est disponible aussi avec les composants Internet type Indy ou ICS.

    Sinon regarde ici: http://www.szutils.net/Delphi/Delphi.php

  20. #20
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 152
    Points
    10 152
    Par défaut
    Citation Envoyé par Harry
    A l'execution ca plante sur la dernière ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Result &#58;= Result+Base64&#91;SixBits +1&#93;;
    avec comme message :
    Index was outside bounds of the array
    Évalue un peu la valeur de SixBits juste avant d'exécuter cette instruction.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. ouvrir une image .JPG qui n'est pas dans la base
    Par merocean dans le forum Requêtes et SQL.
    Réponses: 19
    Dernier message: 12/02/2009, 22h22
  2. Inserer une image.jpg dans table
    Par loumanga dans le forum PostgreSQL
    Réponses: 7
    Dernier message: 30/01/2006, 15h14
  3. Vitesse de chargement d'une image jpg ?
    Par ybruant dans le forum Langage
    Réponses: 6
    Dernier message: 16/11/2004, 21h42
  4. Afficher une image JPG qui se trouve dans une bdd
    Par Harry dans le forum Bases de données
    Réponses: 6
    Dernier message: 27/02/2004, 11h51
  5. Charger et afficher une image jpg avec les mfc
    Par glop - pas glop dans le forum MFC
    Réponses: 3
    Dernier message: 11/02/2004, 19h59

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