2010-06-02 5 views
1

Я довольно новичок в python.получить строку с символами

Я получаю (через pyserial) строку со значениями данных. Как я могу проанализировать эти данные в конкретной структуре данных?

Я знаю, что

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

и я ищу функцию:

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

благодаря

+0

Этот выглядит как 64-битная метка времени, но вы хотите, чтобы это было 2 x 32-битных количества - вы уверены, что это то, что вам нужно? –

+0

@John: Может быть, это временной интервал. В любом случае, если на самом деле это 64-битная временная метка, используйте строку формата 'Q' (unsigned long long), чтобы получить все это. –

+0

@John: Его единственный пример, его действительно 2x32-бит независимые quatities. – Meloun

ответ

2

struct module должно быть именно то, что вы ищете.

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

В строке формата, < означает «интерпретировать все, как мало с обратным порядком байтов, а не использовать родной выравнивание», H означает «без знака короткие» и I означает «без знака Int»

+0

дополнительный вопрос, что делать, если у меня есть строка: id (2 байта), time1 (4 байта), somedata (0-10 байт), time2 (4 байт) .. как я могу определить unpack()? – Meloun

+0

@Meloun: Это будет зависеть от того, как определена длина somedata. Если это зависит от других байтов в сообщении, вам, вероятно, придется разбирать его по частям, поскольку я не думаю, что у структуры есть какой-либо механизм обработки произвольных данных переменной длины. –

2
import struct 
def parse_data(string): 
    return dict(zip(['id','time','time2'],struct.unpack("<HII", string))) 
Смежные вопросы