2010-06-02 10 views
1

Je suis assez nouveau en python. Je reçois (via pyserial) une chaîne avec des valeurs de données. Comment puis-je analyser ces données dans une structure de données particulière?recevoir une chaîne avec des caractères

Je sais que

0-1 byte : id 
2-5 byte : time1 =>but little endian (lsb first) 
6-9 byte : time2 =>but little endian (lsb first) 

et je recherche une fonction:

def parse_data(string): 
    data={} 
    data['id'] = ?? 
    data['time1'] = ?? 
    data['time2'] = ?? 
    return data 

grâce

+0

Cette ressemble à un horodatage 64 bits mais vous le souhaitez en tant que 2 x 32 bits - êtes-vous sûr que c'est ce dont vous avez besoin? –

+0

@John: Peut-être que c'est un intervalle de temps. Quoi qu'il en soit, s'il s'agit d'un horodatage en 64 bits, utilisez la chaîne de format struct 'Q' (unsigned long long) pour tout obtenir. –

+0

@John: Son seul exemple, ses vraies quatités indépendantes de 2x32 bits. – Meloun

Répondre

2

Le struct module devrait être exactement ce que vous cherchez.

import struct 
# ... 
data['id'], data['time1'], data['time2'] = struct.unpack("<HII", string) 

Dans la chaîne de format, < signifie "interpréter tout aussi peu endian, et ne pas utiliser l'alignement natif", H signifie "court non signé" et I signifie "unsigned int"

+0

question supplémentaire, et si j'ai dans la chaîne: id (2bytes), time1 (4bytes), somedata (0-10byte), time2 (4bytes) .. comment puis-je définir unpack()? – Meloun

+0

@Meloun: Cela dépend de la définition de la longueur de somedata. Si cela dépend des autres octets dans le message, vous devrez probablement l'analyser morceau par morceau car je ne pense pas que struct ait un mécanisme pour gérer les données de longueur variable arbitraires. –

2
import struct 
def parse_data(string): 
    return dict(zip(['id','time','time2'],struct.unpack("<HII", string))) 
Questions connexes