Автор Тема: Ошибка в документации  (Прочитано 3744 раз)

SR_team

  • Пользователь
  • *****
  • Сообщений: 6
Ошибка в документации
« : 22 Января 2020, 09:10 »
В структуре пакета данных для команд 0x1E - 0x20 приводится псевдокод для упаковки и распаковки пакетов. В коде распаковки есть ошибка:
Пример. Имеем не упакованную последовательность '\x01\x02\x03\x04', после упаковки получаем '\xCA\xCA\xCB\xC8\xC9', а после распаковки она превращается в '\x80\x80\x01\x02'. Видно, что последовательность смещена в право, а так же, что значение 0x00 распаковывается не полностью, для него выполняется операция XOR, но не выполняется операция из второго цикла:
for(i=0;i<4;i++)OUT[i]=IN[i]|(((IN[4]>>i)&1)<<7);Если тут IN[4] заменить на IN, то последовательность преобразится в '\x00\x00\x01\x02', а замена индексов i у IN на i+1 исправит и смещение, т.е. данная строка в документации должна выглядеть так:
for(i=0;i<4;i++)OUT[i]=IN[i+1]|(((IN[i+1]>>i)&1)<<7);
Если IN[4] там было не просто так и я потенциально что-то сломал, то сообщите об этом пожалуйста, но код с сохранением IN[4], а так же с заменой IN[4] на IN[5] не возвращает изначальной последовательности

SR_team

  • Пользователь
  • *****
  • Сообщений: 6
Re: Ошибка в документации
« Ответ #1 : 22 Января 2020, 09:29 »
Странно, это работает только в приведенном синтетическом примере, реальные данные нормально распаковываются именно алгоритмом из документации. Почему так? Там же тоже множество таких мелких значений 0x00, 0x01, 0x08