Имеете дело с ведущими нулями в функции struct pack / unpack? - PullRequest
0 голосов
/ 13 марта 2020

Я использую библиотеку Python для беспроводной связи ANT + с датчиками. Связь осуществляется путем сопряжения с идентификатором длиной 4-5 цифр. Все работало нормально, пока одно из протестированных устройств не имело идентификатор «00625».

При отслеживании кода источником проблемы является функция struct pack / unpack, используемая для кодирования и декодирования байтов для сообщение протокола ANT +.

>>> from struct import *
>>> pack(b'<H', 11977)
'\xc9.'
>>> unpack(b'<H', '\xc9.')
(11977,)
>>> pack(b'<H', 625)
'q\x02'
>>> unpack(b'<H', 'q\x02')
(625,)
>>> pack(b'<H', 00625)
'\x95\x01'
>>> unpack(b'<H', '\x95\x01')
(405,)

Итак, когда я упаковываю ANT ID 11977 или 625 и затем распаковываю их, я получаю именно то, что упаковал.

Однако, когда я упаковываю ANT ID 00625, а затем распаковать его, я получаю 405 обратно. Не уверен, как я могу go справиться с этим, чтобы я мог правильно упаковать 00625.

1 Ответ

0 голосов
/ 14 марта 2020

Да, я использую Python 2, что означает, что ведущий ноль будет интерпретировать int как восьмеричное. Углубившись в то, как отправляется сообщение, я понял, что вместо передачи начальных нулей, я просто передаю '625' в качестве идентификатора и изменил аргументы функции пакета на pad с двумя байтами pad. Это добилось цели, просто нужно было добавить условие, где любой int, переданный с менее чем 3 цифрами, дополняется, например так:

>>> from struct import *
>>> pack(b'<H', 625)
'q\x02'
>>> pack(b'<xxH', 625)
'\x00\x00q\x02'

Итак, я создал условие в модуле сообщений для использования одного или другого в зависимости от размера ID:

    def deviceNumber(self, device_number):
        if len(str(device_number)) > 3 :
            self._payload[1:3] = pack(b'<H', device_number)
        else :
            self._payload[1:3] = pack(b'<xxH', device_number)

Может быть, есть лучший способ, но он работает, этого пока достаточно!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...