2016-03-25 2 views
0

У меня есть исходный двоичный файл (1 KB ↓), который является дампом последовательных данных потока GPS (наряду с некоторыми связанными метаданными). Я специально пытаюсь извлечь ценность из двоичного файла, который представляет время GPS; Я знаю его смещение и ширину в файле (соответственно 10 и 8 байтов, с общей шириной кадра 28 байтов), но он кодируется очень странным образом, как описано в приведенной ниже цитате.Декодирование скремблированных двоичных данных из GPS с Python

Какой самый Pythonic способ прочитать эти данные (в список или массив)?


GPS TIME - Датчик GPS (время недели в секундах, начиная с субботу 2400 часов/воскресенье 0000 часов), если время GPS Действительно сообщение 3500 устанавливается в 1, в противном случае времени SDN500 системы так сообщается о включении питания. слова данных в порядке 2, 1 (MSW), 4 (LSW), 3.


Длина сообщения слово 16 бит на интерфейсе SDN500-HV. Тем не менее, протокол SDN500-HV, который использует стандартный Универсальный асинхронный приемник (UART), передает данные в 8-битных группах (байтах). Это означает, что для формирования одного сообщения требуется два байта.

Байт информации, передается в виде последовательности 11 бит: один стартовый бит , 8 бит данных (младший значащий бит (LSB), первый), один бит четности (нечетного), и один стоп-бит. Для каждого 16-битного слова данных сначала передается младший младший байт , за которым следует старший байт . Целочисленные и типы данных с плавающей точкой, состоящие из , с наименьшего пронумерованного слова передается более одного слова до наивысшее пронумерованное слово. Единственным исключением из этого правила является тег времени , который выводится в словах 6-9 каждого выходного сообщения HV. Четыре слова данных находятся в следующем порядке: 2,1,4,3, где 1 представляет собой наиболее значимое слово и 4 наименее значимого слова. Каждое слово по отдельности обращается в обратном порядке.

+0

Если вы более владеете другим языком (например, Matlab или C), мне все равно понравится пример фрагмента кода, который будет читать эти данные. Это поможет мне понять, как лучше подходить к чтению в Python. – Nick

+1

Надеюсь, кто-то еще даст вам лучшую информацию, но модуль https://docs.python.org/2/library/struct.html - это то, где вы хотите начать поиск двоичного файла. Я использовал его только один раз на короткое время, поэтому не могу помочь гораздо больше. –

+0

@JLPeyret Да, я возился со структурой.распаковывать варианты и шестнадцатеричный редактор весь день, пытаясь получить разумные значения из этого, но не выяснили, как правильно читать структуру MSB/LSB. Хотя я смог прочитать некоторые другие поля. – Nick

ответ

1

начало, открыв файл

fin = open("20160128t184727_pps","rb") 

затем прочитать в кадре

def read_frame(f_handle): 
    frame = f_handle.read(28) # 28 byte frame size 
    start_byte = 10 
    end_byte = 18 # 4 words each word is 2 bytes 
    timestamp_raw = frame[start_byte:end_byte] 
    timestamp_words = struct.unpack(">HHHH",timestamp_raw) 

я мог бы помочь больше, но я не понимаю, где метка времени StartByte-величина и endbyte от вашего описания, как он, похоже, не соответствует описанию, которое вы цитировали ... Я также не знаю, каково ожидаемое значение вывода ... если вы предоставили эти детали, я, вероятно, мог бы помочь больше

+0

Спасибо. Я отредактировал вопрос несколько минут назад, поскольку у меня была неправильная ширина. Я дам ваш подход выстрелом. – Nick

+0

oh ok Я вижу, теперь это звучит более реалистично ... Объединив их обратно, я не уверен, чего вы ожидаете? что-то вроде '20160322134566' (YMDHMS)? или временную метку секунд с эпохи? или ? –

+0

GPS сообщает время с начала недели (начиная с воскресенья). Я думаю, что это за секунды. – Nick