Прочтите двоичный файл и проверьте соответствие символа в python - PullRequest
0 голосов
/ 17 июня 2020

Я хотел бы побайтно сканировать файлы данных с GPS-приемника (на самом деле это будет непрерывный поток, не хочу тестировать код с автономными данными). Если найдено совпадение, то проверьте следующие 2 байта на «длину», получите следующие 2 байта и сдвиньте 2 бита (не байт) вправо, et c. Раньше я не работал с двоичными файлами, поэтому застрял на простой задаче. Я мог читать двоичный файл побайтно, но не могу найти способ сопоставления по желаемому шаблону (например, D3).

with open("COM6_200417.ubx", "rb") as f:
byte = f.read(1)  # read 1-byte at a time
while byte != b"":
    # Do stuff with byte.
    byte = f.read(1)
    print(byte) 

Выходной файл:

b'\x82'
b'\xc2'
b'\xe3'
b'\xb8'
b'\xe0'
b'\x00'
b'@'
b'\x13'
b'\x05'
b'!'
b'\xd3'
b'\x00'
b'\x13'

.... как проверить, является ли этот байт == '\ xd3'? (D3) также хотел бы знать, как выполнить побитовый сдвиг, поскольку мне нужно проверить десятичное значение, состоящее из 6 бит (1-байт и первые 2 бита следующего байта). Принимая во внимание 2 байта (8 бит), а затем 2-битный сдвиг вправо, чтобы получить 6 бит. Возможно ли в python? Приветствуются любые улучшения / дополнения / изменения.

ps. Могу я избавиться от надоедливой буквы «b» спереди? но если игнорирование не повлияет, то никаких проблем.

Заранее спасибо.

1 Ответ

1 голос
/ 17 июня 2020

«Этот байт» представлен буквой «b» впереди, указывающей, что это байтовый объект. Чтобы избавиться от него, вы можете преобразовать его в int:

thatbyte = b'\xd3'
byteint = thatbyte[0]  # or
int.from_bytes(thatbyte, 'big')  # 'big' or 'little' endian, which results in the same when converting a single byte

Для сравнения вы можете сделать:

thatbyte == b'\xd3'

Таким образом сравните байтовый объект с другим байтовым объектом. Оператор shift << работает только с int </p>

Чтобы преобразовать int обратно в байты (при условии, что это [0..255]), вы можете использовать:

bytes([byteint])   # note the extra brackets!

А что касается улучшений , Я бы посоветовал прочитать сразу весь двоичный файл:

with open("COM6_200417.ubx", "rb") as f:
    allbytes = f.read() # read all
    for val in allbytes:
        # Do stuff with val, val is int !!!
        print(bytes([val]))
...