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 :

Conversion d'un texte en Binaire et inversement sous Delphi XE7


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Profil pro
    developpeur
    Inscrit en
    Mars 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Bénin

    Informations professionnelles :
    Activité : developpeur

    Informations forums :
    Inscription : Mars 2010
    Messages : 25
    Points : 21
    Points
    21
    Par défaut Conversion d'un texte en Binaire et inversement sous Delphi XE7
    Bonjour à tous. je développe une application qui doit communiquer avec une machine en binaire.
    j'aimerai avoir un fonction qui converti un texte par exemple {bonjour le forum} en binaire par exemple {01100010011011110110111001101010011011110111010101110010001000000110110001100101001000000110011001101111011100100111010101101101}. d'après mes recherches, j'ai trouvé deux fonctions StrBinToStr et StrToStrBin que voici:

    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
    function StrBinToStr(const S: string): string;
    var pInput : pchar;
        pOutput : ^byte;
        N, LenInput : integer;
    const AtBin : array['0'..'1'] of byte =(0,1);
    begin
      LenInput:=Length(S);
      SetLength(Result, LenInput shr 3);
      LenInput:=Length(result);
      pInput:=PChar(S);
      pOutput:=@result[1];
      for N:=1 to LenInput do
        begin
          pOutput^ :=0;
          pOutput^ :=byte((AtBin[pInput[0]] shl 7) or
                         (AtBin[pInput[1]] shl 6) or
                         (AtBin[pInput[2]] shl 5) or
                         (AtBin[pInput[3]] shl 4) or
                         (AtBin[pInput[4]] shl 3) or
                         (AtBin[pInput[5]] shl 2) or
                         (AtBin[pInput[6]] shl 1) or
                          AtBin[pInput[7]]);
          inc(pInput,8);
          inc(pOutput);
        end;
    end;
    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
    function StrToStrBin(const S: string): string;
    var pOutput : pchar;
        pInput : ^byte;
        N, LenInput : integer;
     
    const AtBin : array[boolean] of char = '01';
     
    begin
      LenInput:=Length(S);
      SetLength(Result, LenInput shl 3);
      pInput:=@S[1];
      pOutput:=pChar(result);
      for N:=1 to LenInput do
        begin
          pOutput[0]:=AtBin[(pInput^ and $80)=$80];
          pOutput[1]:=AtBin[(pInput^ and $40)=$40];
          pOutput[2]:=AtBin[(pInput^ and $20)=$20];
          pOutput[3]:=AtBin[(pInput^ and $10)=$10];
          pOutput[4]:=AtBin[(pInput^ and $08)=$08];
          pOutput[5]:=AtBin[(pInput^ and $04)=$04];
          pOutput[6]:=AtBin[(pInput^ and $02)=$02];
          pOutput[7]:=AtBin[(pInput^ and $01)=$01];
          inc(pOutput,8);
          inc(pInput);
        end;
    end;
    ces deux fonctions marchent parfaitement sous Delphi 7 par exemple texte {bonjour le forum} equivaut en binaire à: {01100010011011110110111001101010011011110111010101110010001000000110110001100101001000000110011001101111011100100111010101101101} et inversement.

    Mais sous Delphi XE7 cela ne marche pas du tout. le Binaire ci-dessus donne ceci { 潢橮畯⁲敬映牯浵偤牡楴污祬牔湡灳 } sous Delphi XE7
    Aidez-moi SVP. Merci

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 449
    Points : 24 856
    Points
    24 856
    Par défaut
    Conflit avec l'Unicode
    Il faut remplacer PChar par PAnsiChar et string par RawByteString
    Faudra vérifier si vous envoyez du texte de savoir, si il est ASCII 7bits, ANSI 8 bits sous quel charset, UTF8 ...

    Sinon attention au mode binaire, il est peu probablement qu'il faille envoyer un binaire en texte mais plutôt directe un bloc mémoire qui est naturellement en binaire, en fait une string, c'est un binaire en mémoire, faut juste que le programme et la machine utilise le même encodage (charset)
    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

  3. #3
    Membre à l'essai
    Profil pro
    developpeur
    Inscrit en
    Mars 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Bénin

    Informations professionnelles :
    Activité : developpeur

    Informations forums :
    Inscription : Mars 2010
    Messages : 25
    Points : 21
    Points
    21
    Par défaut
    Merci ShaiLeTroll pour la promptitude. J vais appliquer et vous revenir. merci bien

  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
    pour préciser la réponse de Shai

    un string depuis Delphi 2009 est unicode, donc un caractère tient sur 16bits et non 8

    donc la fonction n'a pas de sens en unicode.

    soit il faut générer une binaire 2 fois plus long

    soit il faut convertir la chaîne unicode en chaîne ANSI, les caractères sont alors codés sur 8bits dans une page de code donnée (qui ne peut donc pas représenter n'importe quel caractère unicode).

    typiquement, en unicode je peux écrire s := 'bonjour こんにちは صباح الخير' qui n'aura pas d'équivalent en ANSI.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Membre à l'essai
    Profil pro
    developpeur
    Inscrit en
    Mars 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Bénin

    Informations professionnelles :
    Activité : developpeur

    Informations forums :
    Inscription : Mars 2010
    Messages : 25
    Points : 21
    Points
    21
    Par défaut
    C'est résolu...! tout marche parfaitement. Merci Shaill

  6. #6
    Membre à l'essai
    Profil pro
    developpeur
    Inscrit en
    Mars 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Bénin

    Informations professionnelles :
    Activité : developpeur

    Informations forums :
    Inscription : Mars 2010
    Messages : 25
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    pour préciser la réponse de Shai

    un string depuis Delphi 2009 est unicode, donc un caractère tient sur 16bits et non 8

    donc la fonction n'a pas de sens en unicode.

    soit il faut générer une binaire 2 fois plus long

    soit il faut convertir la chaîne unicode en chaîne ANSI, les caractères sont alors codés sur 8bits dans une page de code donnée (qui ne peut donc pas représenter n'importe quel caractère unicode).

    typiquement, en unicode je peux écrire s := 'bonjour こんにちは صباح الخير' qui n'aura pas d'équivalent en ANSI.
    Merci pour le précision

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

Discussions similaires

  1. conversion hex texte vers binaire
    Par yannick85 dans le forum C#
    Réponses: 5
    Dernier message: 23/08/2013, 21h04
  2. conversion text to binaire
    Par shootgirl dans le forum MATLAB
    Réponses: 1
    Dernier message: 20/06/2011, 11h29
  3. Conversion text en binaire
    Par jerofavre dans le forum C++
    Réponses: 10
    Dernier message: 12/02/2010, 12h18
  4. Conversion caractère en binaire (et inversement)
    Par Zubrowsky dans le forum VBScript
    Réponses: 1
    Dernier message: 26/05/2008, 17h55
  5. Réponses: 2
    Dernier message: 09/12/2006, 18h01

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