J'ai cette chaîne: Hello world !!
et je veux l'imprimer en utilisant Python comme 48:65:6c:6c:6f:20:77:6f:72:6c:64:20:21:21
.
hex()
ne fonctionne que pour les entiers.
Comment ceci peut être fait?
python
string
hex
ordinal-indicator
Eduard Florinescu
la source
la source
str
ou Python 3bytestring
), car il n'y a pas de transformation univoque d'un caractère en un entier de 0… 255. Ainsi, les chaînes de caractères (Python 2unicode
et Python 3str
) nécessitent d'abord un certain encodage avant d'être convertibles dans ce format hexadécimal. La réponse d'Aaron Hall illustre cela.Réponses:
Vous pouvez transformer votre chaîne en un générateur int, appliquer une mise en forme hexadécimale pour chaque élément et intercaler avec un séparateur:
la source
str
as hex n'a pas vraiment de sens; vous voudrez imprimer l'bytes
objet en hexadécimal (convertirstr
enbytes
en appelant.encode()
).":".join("{:02x}".format(ord(c)) for c in 'løl')
renvoie'6c:f8:6c'
, tandis que":".join("{:02x}".format(c) for c in 'løl'.encode())
produit la représentation utf-8 correcte'6c:c3:b8:6c'
.":".join("{:04x}".format(ord(c)) for c in s)
(en remplaçant02x
par un04x
remplissage à zéro de chaque numéro pour qu'il soit composé de 4 chiffres) à la placeWARNING: Calling str(pkt) on Python 3 makes no sense!
la source
h = binascii.hexlify(b"Hello world !!") to get hex string. b":".join(h[i:i+2] for i in range(0, len(h), 2))
pour y insérer':'
tous les deux chiffres hexadécimaux.LookupError: 'hex' is not a text encoding; use codecs.encode() to handle arbitrary codecs
Pour Python 2.x:
Le code ci-dessus ne fonctionnera pas avec Python 3.x , pour 3.x, le code ci-dessous fonctionnera:
la source
Une autre réponse en deux lignes que certains pourraient trouver plus facile à lire et qui aide au débogage des sauts de ligne ou d'autres caractères impairs dans une chaîne:
Pour Python 2.7
Pour Python 3.7 (non testé sur toutes les versions de 3)
la source
codecs.encode(<bytestring>, "hex")
fonctionne, cependant.import sys
;s="Déjà vu Besançon,Lupiñén,Šiauliai,Großräschen,Łódź,Аша,广东省,LA"
;for c in s:
;w=sys.stdout.write(c+":"+c.encode('utf-8').hex()+"||")
; (sort)D:44||é:c3a9||j:6a||à:c3a0|| :20||v:76||u:75|| :20||B:42||e:65||s:73||a:61||n:6e||ç:c3a7||o:6f||n:6e||,:2c||L:4c||u:75||p:70||i:69||ñ:c3b1||é:c3a9||n:6e||,:2c||Š:c5a0||i:69||a:61||u:75||l:6c||i:69||a:61||i:69||,:2c||G:47||r:72||o:6f||ß:c39f||r:72||ä:c3a4||s:73||c:63||h:68||e:65||n:6e||,:2c||Ł:c581||ó:c3b3||d:64||ź:c5ba||,:2c||А:d090||ш:d188||а:d0b0||,:2c||广:e5b9bf||东:e4b89c||省:e79c81||,:2c||L:4c||A:41||
Quelques compléments à Fedor Gogolev répondent:
Premièrement, si la chaîne contient des caractères dont le «code ASCII» est inférieur à 10, ils ne seront pas affichés comme requis. Dans ce cas, le format correct doit être
{:02x}
:Deuxièmement, si votre "chaîne" est en réalité une "chaîne d'octets" - et puisque la différence compte dans Python 3 - vous préférerez peut-être ce qui suit:
Veuillez noter qu'il n'y a pas besoin de conversion dans le code ci-dessus car un objet bytes est défini comme "une séquence immuable d'entiers dans la plage 0 <= x <256" .
la source
La réponse acceptée donne:
Retour:
La réponse acceptée ne fonctionne que tant que vous utilisez des octets (principalement des caractères ascii). Mais si vous utilisez unicode, par exemple:
Vous devez d'une manière ou d'une autre convertir en octets.
Si votre terminal n'accepte pas ces caractères, vous pouvez décoder à partir de UTF-8 ou utiliser les noms (vous pouvez donc coller et exécuter le code avec moi):
Nous voyons donc que:
Retour
un résultat médiocre / inattendu - ce sont les points de code qui se combinent pour former les graphèmes que nous voyons dans Unicode, du consortium Unicode - représentant des langues du monde entier. Ce n'est pas ainsi que nous stockons ces informations afin qu'elles puissent être interprétées par d'autres sources, cependant.
Pour permettre à une autre source d'utiliser ces données, nous aurions généralement besoin de convertir en encodage UTF-8, par exemple, pour enregistrer cette chaîne en octets sur le disque ou pour la publier en html. Nous avons donc besoin de cet encodage pour convertir les points de code en unités de code de UTF-8 - en Python 3,
ord
n'est pas nécessaire car ilbytes
existe des itérables d'entiers:Ou peut-être plus élégamment, en utilisant les nouvelles f-strings (uniquement disponibles en Python 3):
En Python 2, passez
c
auord
premier, c'estord(c)
-à- dire - plus d'exemples:la source
Vous pouvez utiliser
hexdump
les(ajoutez
.lower()
si vous avez besoin de minuscules). Cela fonctionne pour Python 2 et 3.la source
pip install -U hexdump --proxy http://proxy.address:port
sudo
avecpip
, ce qui a gâchépacman
...L'utilisation de la carte et de la fonction lambda peut produire une liste de valeurs hexadécimales, qui peuvent être imprimées (ou utilisées à d'autres fins)
la source
[hex(ord(c)) for c in s]
Cela peut être fait des manières suivantes:
La sortie de ceci sera en hexadécimal comme suit:
la source
__future__
est une bibliothèque standard disponible dans les versions récentes de Python 2 qui peut être utilisée pour rendre les fonctionnalités normalement uniquement dans Python 3 rétrocompatibles. Dans cette réponse, il est utilisé pour obtenir laprint(text)
fonction "fonction d'impression", qui remplace laprint text
syntaxe de Python 2. Voir la documentation Python .Un peu plus général pour ceux qui ne se soucient pas de Python3 ou des deux-points:
la source
Utilisation
base64.b16encode
en python2 (son intégré)la source
.decode()
?Juste pour plus de commodité, très simple.
la source
pour quelque chose qui offre plus de performances que
''.format()
, vous pouvez utiliser ceci:désolé, cela ne pourrait pas être plus
beau, ce serait bien si on pouvait simplement le faire
'%02x'%v
, mais cela ne prend que des int ...mais vous serez coincé avec des chaînes d'octets
b''
sans logique de sélectionord(v)
.la source