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

Python Discussion :

ne pas transformer \ en \\ ? & variables hexa-ascii


Sujet :

Python

  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 54
    Par défaut ne pas transformer \ en \\ ? & variables hexa-ascii
    Bonjour
    Je travaille en ce moment sur un script avec des sockets
    Quand on envoit un texte avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.connexion.send(message_emis)
    cela envoi en réalité par la valeur hexadécimale du code ASCII.



    En faite, au lieu d'envoyer un texte, j'aimerais envoyer mon code hexa-ASCII

    le problème : si je veux envoyer "56 69 6e 73" (qui est l'hexa-ASCII de "Vins")
    le script va envoyer 5 puis 6, puis 6, 9, 6, e, ... dans leur valeur (hexa-ASCII)

    Pour contourner, je pourrais mettre dans ma variable la valuer "texte" du code hexa-ASCII
    c'est à dire que si je veux envoyer l'hexa-ASCII de "56 69 6E 73"
    il me suffit d'envoyer "Vins" dans une varible texte

    Mais si je veux envoyer "18 00 01 56 69 6E 73" ?????
    (pas d'équivalent texte pour 18, 00, 01, 02 ... ; enfin c'est \x18, x\00, ...)
    Je ne peux pas envoyer le texte "\x18 x\00 x\01 VINS"
    car sinon Python enverrai l'hexa-ascii de "\", "x", "1", "18", ... "V", "I", "N", "S"

    Je sais seulement que je peux convertir mon texte
    en hexa-ASCII avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ("%X" % ord("VAR_TEXTE"))
    ou le contraire avec :
    Donc est-il possible de déclarer des variables en Hexa pour envoyer directement le contenu en hexa, et pas le texte de la variable hexa ? ou existe-il une méthode qui demande comme argument à envoyer une valeur en hexa-Ascii ?


    Merci

  2. #2
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 54
    Par défaut
    un petit coup d'oeil à la table ASCII
    et je vois :
    Décimal Octal Hex Binaire Caractère
    000 000 00 00000000 NUL (Null char.)
    001 001 01 00000001 SOH (Start of Header)
    018 022 12 00010010 DC2 (Device Control 2)
    l'idéal serait de pouvoir envoyer un "null char" ou un "start of header" depuis un chaine.
    mais ça ne doit pas être possible, non ?

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Par défaut
    En python si tu n'utilises pas de raw strings tu peux utiliser \xhh (remplace hh par un code ASCII en hexadécimal)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> print "\x56\x69\x6e\x73"
    Vins

  4. #4
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 54
    Par défaut
    c'est pas bon puisque c'est enregistré en tant que texte
    Python va envoyer sur le socket :
    "\", "x", "5", "6"

    Ce que j'aimerais, c'est que le message soit considéré comme du code ascii, et pas le texte "\x56"

    mon but final, c'est qu'en utilisant un sniffer, on voit quelque-chose comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    18 00 00 00 01 00 00 00 56 69 6e 73 32 00 00 00   ........Vins2...
    00 00 00 00 00 00 00 00 9e f4 31 01               ..........1.
    mais si j'envois le texte .".......Vins2.............1."

    j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    2e 2e 2e 2e 2e 2e 2e 2e 56 69 6e 73 32 2e 2e 2e   ........Vins2...
    2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 31 2e               ..........1.
    car "." = "\x2e"

    et la connexion au serveur échoue

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Par défaut
    Et avec chr?

  6. #6
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 54
    Par défaut
    problème presque résolu, le problème en faite est
    ceci marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connexion.send('\x18\x00\x00\x00\x01\x00\x00\x00Vins2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9e\xf41\x01')
    mais ceci ne marche pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    pck=raw_input()
    connexion.send(pck)
    en tapant \x18\x00\x00\x00\x01\x00\x00\x00Vins2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9e\xf41\x01
    ou '\x18\x00\x00\x00\x01\x00\x00\x00Vins2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9e\xf41\x01'

    comment ça ce fait qu'en passant par un raw_input, ça ne marche plus ??

    en faite, le fait de passer par raw_input
    ça me transforme les "\" en "\\"

    comment faire pour ne pas les transformer ???

  7. #7
    Membre émérite

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Par défaut
    Tu peux utiliser les expressions régulières pour remplacer le tout

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    import re
     
    #[...]
     
    pck = raw_input()
    pck = re.sub(r'\\x([a-f0-9]){2}', lambda o: chr(int(o.group(1), 16)), pck, re.I)

  8. #8
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 54
    Par défaut
    merci
    enfin, désolé, mais ça replace que 2 occurences de '\' de la chaine

    enfin, avec une boucle while et un find(), je devrais pouvoir m'arranger

  9. #9
    Membre émérite

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Par défaut
    C'est parce que je me suis trompé dans les paramètres de la fonction replace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    import re
     
    #[...]
     
    pck = raw_input()
    regex = re.compile(r'\\x([a-f0-9]){2}', re.I)
    pck = regex.sub(lambda o: chr(int(o.group(1), 16)), pck)

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/09/2006, 08h58
  2. [MySQL] Pas d'enregistrement de variable dans ma BD
    Par Delf dans le forum PHP & Base de données
    Réponses: 32
    Dernier message: 20/07/2006, 17h17
  3. [MySQL] Récuperer des données POST qui ne possedent pas de nom de variable
    Par ArnaudD dans le forum PHP & Base de données
    Réponses: 22
    Dernier message: 23/06/2006, 17h22
  4. Transformer de l'Unicode en ASCII
    Par kow_Ced dans le forum Langage
    Réponses: 4
    Dernier message: 28/10/2005, 08h53
  5. Ne pas transformer les <br/> a l'ecriture du fichier X
    Par fidififouille dans le forum XMLRAD
    Réponses: 2
    Dernier message: 07/05/2004, 10h11

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