2010-01-07 3 views
2

J'ai une liste d'octets comme suitPython insérer un entier court dans une liste d'octets

pkt_bytes = [ 0x02,0x07, 0xff,0xff ,0x00,0x03] 

en position 0xff,0xff Je veux mettre un 16bit entier court

Comment puis-je faire

Cordialement

+1

Voulez-vous remplacer * * les deux éléments '0xff' avec quelque chose? S'il vous plaît clarifier votre question. –

+0

petit ou gros boutiste? – ebo

+0

Salut Je pense que j'ai besoin d'utiliser la fonction struct pack (j'aurai besoin d'insérer d'autres types de données dans le paquet en dehors des entiers courts). J'essaie de construire des paquets pour envoyer sur un réseau, c'est gros format endian Merci – mikip

Répondre

5

Vous pouvez utiliser le struct module pour emballer des valeurs dans des formats appropriés:

>>> pkt_bytes = [0x02, 0x07, 0xff, 0xff, 0x00, 0x03] 
>>> myint = 123 
>>> pkt_bytes[3:5] = [ord(b) for b in struct.pack("H",myint)] 
>>> pkt_bytes 
[2, 7, 255, 123, 0, 3] 

Par défaut, cela utilisera l'ordre natif des octets, mais vous pouvez remplacer cela en utilisant les modificateurs pour formater la chaîne. Étant donné que votre variable est appelée pkt_bytes Je suppose que vous voulez réseau (big-endian) l'ordre des octets qui est signifié par un !:

>>> struct.pack("!H",5000) 
'\x13\x88' 
+0

Merci Dave, vous êtes une star – mikip

0

Essayez:

>>> pkt_bytes.insert(3, 0xaa) 

>>> help(pkt_bytes.insert) 
Help on built-in function insert: 

insert(...) 
    L.insert(index, object) -- insert object before index 
0

Le code ci-dessous remplacera toutes les occurrences de 0xff avec 0x04 jusqu'à ce qu'il n'y ait plus 0xff left dans la liste.

pkt_bytes = [0x02, 0x07, 0xff, 0xff ,0x00, 0x03] 
while True: 
    try: 
     idx = pkt_bytes.index(0xff) 
     pkt_bytes[idx] = 0x04 
    except ValueError: 
     break 
0
>>> pkt_bytes = [ 0x02,0x07, 0xff,0xff ,0x00,0x03] 
>>> pkt_bytes[2:4] = [pkt_bytes[2] << 8 | pkt_bytes[3]] 
>>> pkt_bytes 
[2, 7, 65535, 0, 3] 
Questions connexes