Почему существуют различия при кодировании CBOR в библиотеках Python и библиотеке RIOT OS C?

#python #c #python-3.x #cbor

Вопрос:

Итак, у меня есть эта штука

 {'apn': 'censored', 'support_data_mode': False, 'data_usr_name': 'censored', 'data_password': 'censored'} 
 

Когда я читаю эти данные из системы, которая использует NanoCBOR, я получаю что-то вроде этого

 b'xbfcapnjcensoredqsupport_data_modexf4mdata_usr_namedcensoredmdata_passworddcensoredxff'
 

и я могу расшифровать его в Python 3 и получить правильный результат. Но когда я пытаюсь закодировать его обратно, это выглядит так

 b'xa4capnjcensoredqsupport_data_modexf4mdata_usr_namedcensoredmdata_passworddcensored'
 

и система не принимает его обратно как действительное сообщение.

А перепробовал все библиотеки Python cbor, cbor2 Флинна и флинна.

Документация скудна, и я не знаю, что делать, чтобы закодировать ее в правильном формате.

Комментарии:

1. Похоже, они оба правы. NanoCBOR использует xbf для обозначения карты неопределенной длины, затем xff для обозначения конца карты. Python использует xa4 для обозначения карты, на которой есть ровно 4 объекта, поэтому в конце не требуется xff. Оба являются правильными форматами CBOR. Вы должны увидеть, что не так с вашей системой NanoCBOR.

2. @Marcin Szymczyk — Ответ должен быть опубликован как Ответ, а не отредактирован в вопросе.

Ответ №1:

Я нашел ответ. Да, оба формата верны, но дело было не в этом. Проблема заключалась в том, как создать xbf своего рода карту на python. И я это сделал!

 from flunn import dumps, loads, mapping
dump_map = [('device_id', 1), ('power_status', 1)]
payload = dumps(mapping((a for a in dump_map)))
 

В результате получается:

 b'xbfidevice_idx01lpower_statusx01xff'
 

Теперь формат такой, как я хотел, и система приняла его как действительный.