2010-10-29 5 views
3

J'ajoute quelques octets hexadécimaux dans un packet = [] et je veux retourner ces octets hexadécimaux sous la forme de 0x__ en tant que données hexadécimales.Interpréter la chaîne 0x comme hexadécimal en Python

packet.append("2a") 
packet.append("19") 
packet.append("00") 
packet.append("00") 

packHex = [] 

for i in packet: 
    packHex.append("0x"+i) #this is wrong 

return packHex 

Comment puis-je aller sur la conversion ('2a', '19', '00', '00') en packet pour obtenir (0x2a, 0x19, 0x0, 0x0) à packHex? J'ai besoin de vraies données hexadécimales, pas de chaînes qui ressemblent à des données hexadécimales.

Je l'assemblage d'un paquet à envoyer sur pcap, pcap_sendpacket(fp,packet,len(data))packet doit être une liste hexadécimal ou tuple pour moi, peut-être il peut être fait en décimal, ont pas essayé, je préfère hex. Merci pour votre réponse.

packetPcap[:len(data)] = packHex

Résolu:

for i in packet: packHex.append(int(i,16))

Si la sortie en hexadécimal nécessaire, cette commande peut être utilisée: print ",".join(map(hex, packHex))

+2

quelle que soit « données réelles hexagonaux » est ... – hop

+0

Désolé, tryna » le garder « vrai » ... - hop 1 min il y a – soulseekah

Répondre

3

Pourquoi ne pas construire un list de int s et juste les imprimer en base 16 (soit en utilisant "%x"%value ou hex) à la place? Si les valeurs vous sont données sous cette forme (par exemple à partir d'une autre source), vous pouvez utiliser int avec le second paramètre facultatif pour le transformer en int.

>>> int('0x'+'2a',16) 
42 
>>> packet=["2a","19","00","00"] 
>>> packet=[int(p,16) for p in packet] 
>>> packet 
[42, 25, 0, 0] 
>>> print ", ".join(map(hex,packet)) 
0x2a, 0x19, 0x0, 0x0 
+0

Je suis en train d'assembler un paquet à envoyer sur 'pcap',' pcap_sendpacket (fp, paquet, len (data)) 'où' packet' devrait être une liste hexadécimale ou un tuple pour moi, peut-être que cela peut être fait en décimal, n'ai pas essayé, je préfère hex. Merci pour votre réponse. – soulseekah

+3

@Soulseekah: Toutes les valeurs sont binaires sous le capot. Hex ou décimal est seulement la représentation lorsque vous le convertissez en une chaîne lors de l'impression. Ainsi, les distinctions telles que "nombre hexadécimal" et "nombre décimal" n'ont aucun sens pour les valeurs stockées dans des variables. – MAK

+0

J'ai besoin de 'paquetPcap [: len (données)] = packHex' où' packHex' contient quelque chose comme '(0x00, 0x1F, 0x3C, 0x84, 0x70, 0x22, 0x1C, 0xAF, 0xF7)'. Merci de votre aide. +1 – soulseekah

5

Vous ne voulez pas vraiment 'données hex' , vous voulez des entiers. La notation hexadécimale n'a de sens que lorsque vous avez des nombres représentés sous la forme de chaînes.

Pour résoudre votre problème, utilisez une compréhension de la liste:

[int(x, 16) for x in packet] 

Ou pour obtenir le résultat comme un tuple:

tuple(int(x, 16) for x in packet) 
+0

Nope, qui ne donne pas lieu à des valeurs hexagonales, que les résultats en valeurs décimales. – soulseekah

+2

C'est juste la représentation. Les entiers sont des nombres. Hexadécimal et décimal et octal sont des moyens de représenter le nombre. '0x34' et' 52' sont * le même nombre *. Si vous voulez * imprimer * le nombre en hexadécimal, c'est complètement différent, et c'est là qu'intervient le format de chaîne 'x'. –

+0

Merci pour vos réponses et vos commentaires. L'affaire a été éclaircie maintenant. Désolé de ne pas avoir accepté votre réponse @Mark, j'ai aimé le 'map' supplémentaire lancé par @MAK, sinon vous étiez le premier et le point. Merci. – soulseekah

-1

Supposons que vous avez un list = ["2a", "19", "00", "00"]

Pour moi, j'utilise list = [hex(int(i, 16)) for i in vals]

Il retourne alors une nouvelle liste avec le type hexagonal de tous les éléments.

>>>['0x2a', '0x19', '0x0', '0x0'] 
+0

Cela ne répond pas à la question. – muddyfish

Questions connexes