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 :

Comment obtenir la représentation hexadecimale d'une chaine de caractères


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 34
    Par défaut Comment obtenir la représentation hexadecimale d'une chaine de caractères
    Comment obtenir la représentation hexadecimale d'une chaine de caractères

    Bonjour,

    Je cherche l'équivalent de la fonction php unpack:
    unpack('H*', 'AIJKZ') => string(10) "41494a4b5a"

    hex(ord('A')) + hex(ord('I')) + hex(ord('J')) + hex(ord('K')) + hex(ord('Z')) retourne '0x410x490x4a0x4b0x5a",
    ce qui n'est pas tout à fait la même chose.

    Merci.

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 078
    Par défaut
    C'est vrai que c'est une notation assez spéciale

    J'ai créé une fonction hexa pour ton cas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def hexa(nb):
    	res=[]
    	for i in nb: res.append(hex(ord(i)).strip('0x'))
    	print ''.join(res)
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hexa=lambda nb:''.join([hex(ord(i)).strip('0x') for i in nb])
    Résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> hexa('AIKZTYUI')
    41494b5a54595549

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 762
    Par défaut
    Salut,
    Juste pour le fun:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> hexs=lambda s: ''.join(map(lambda c: '%02x' % ord(c), s))
    >>> hexs('xyz')
    '79787a'
    >>>
    - W
    PS: "map" applique une fonction sur les items d'un iterable, ici un string.
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 34
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    C'est vrai que c'est une notation assez spéciale
    rien de spécial, c'est pour mettre à plat du packed-décimal.

    la fonction hexs est juste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> hexs=lambda s: ''.join(map(lambda c: '%02x' % ord(c), s))
    >>> hexs('abc\ndef')
    '6162630a646566'
    >>>
    la fonction hexa est fausse, elle supprime le quartet de gauche quand il est égal à zéro.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> hexa=lambda nb:''.join([hex(ord(i)).strip('0x') for i in nb])
    >>> hexa('abc\ndef')
    '616263a646566'
    >>>
    il faut la modifier comme ci-dessous ".rjust(2, '0')"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> hexa=lambda nb:''.join([hex(ord(i)).strip('0x').rjust(2, '0') for i in nb])
    >>> hexa('abc\ndef')
    '6162630a646566'
    >>>
    j'ai trouvé des choses plus sophistiquées :
    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
    def comp3(nb):
    	cumul = 0
    	for c in nb[:-1]:
    		i = ord(c)  
    		gauche = (i & 0xf0) >> 4      #    quartet gauche (fort)
    		droit = i & 0x0f              #    quartet droit (faible)
    		cumul = cumul * 10 + gauche   #    on cumule
    		cumul = cumul * 10 + droit 
     
    	i = ord(nb[-1])  
    	gauche = (i & 0xf0) >> 4      	  #    quartet gauche (unité)
    	sign = i & 0x0f	                  #	   le signe	
    	cumul = cumul * 10 + gauche       #    on cumule
     
    	if sign in (0x0b, 0x0d ):
    		return '-' + str(cumul)
    	else:
    		return '+' + str(cumul)
     
    def comp3B(nb):
    	cumul = ''
    	for c in nb[:-1]:
    		i = ord(c)  
    		gauche = (i & 0xf0) >> 4      		#    quartet gauche (fort)
    		droit = i & 0x0f              		#    quartet droit (faible)
    		cumul += str(gauche) + str(droit)	#    on cumule
     
    	i = ord(nb[-1])  
    	gauche = (i & 0xf0) >> 4      	 		#    quartet gauche (unité)
    	sign = i & 0x0f	                   		#    le signe	
    	if sign in (0x0b, 0x0d ):
    		return '-' + cumul + str(gauche)
    	else:
    		return '+' + cumul + str(gauche)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> comp3(chr(0x29) + chr(0x00) + chr(0x3d))
    '-29003'
    >>> comp3(chr(0x29) + chr(0x00) + chr(0x3f))
    '+29003'
    >>>
    reste à voir les temps de réponse.

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 762
    Par défaut
    Salut,
    bibliothèque que je n'ai pas trouvée tantôt mais qui est applicable ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> import binascii
    >>> binascii.hexlify('abcdght')
    '61626364676874'
    -W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 34
    Par défaut
    Bravo wiztricks,

    c'est exactement ce que je cherchais.
    conversion d'un fichier de 4Mo en entrée (8 en sortie)

    binascii.hexlify : 0,04 sec
    unpack php : 0,07 sec
    lambda hexs : 4,10 sec

    merci

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

Discussions similaires

  1. Comment obtenir offset de String dans une chaine
    Par L4BiN dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 09/07/2009, 13h42
  2. Réponses: 2
    Dernier message: 03/10/2005, 16h23
  3. Réponses: 2
    Dernier message: 14/01/2005, 15h40
  4. comment vider une chaine de caractère
    Par gaut dans le forum C
    Réponses: 13
    Dernier message: 12/09/2003, 11h30
  5. Réponses: 2
    Dernier message: 06/12/2002, 07h50

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