CRC16 и передача данных
Привет, я пытался вычислить CRC для устройства, для которого я хочу написать программный интерфейс. Для простоты я скажу, что X - это устройство, а Y - это аппаратный контроллер. Я ищу толчок в правильном направлении, я уверен, что я на правильном пути, немного запутавшись в нескольких моментах.
Когда устройство находится в режиме ожидания, каждые две секунды он отправляет следующие строки данных, которые выглядят так, как если бы они считали в шестнадцатеричном виде: 2 байта между | |
это CRC я предполагаю. (XX) - это переменный байт.
X: 96 10 01 E1 (E4) 01 FF 10 17 | F7 EC | 10 06 E1 96 FE X: 96 10 01 E1 (E6) 01 FF 10 17 | 7F FA | 10 06 E1 96 FE X: 96 10 01 E1 (E8) 01 FF 10 17 | C7 9B | 10 06 E1 96 FE X: 96 10 01 E1 (EA) 01 FF 10 17 | 4F 8D | FE 10 06 E1 96 FE X: 96 10 01 E1 (EC) 01 FF 10 17 | D7 B6 | FE 10 06 E1 96 FE X: 96 10 01 E1 (EE) 01 FF 10 17 | 5F A0 | FE 10 06 E1 96 FE
С помощью reveng
с reveng -w 16 -s
и вышеупомянутые наборы данных, которые я получаю:
width = 16 poly = 0x1021 init = 0x1e69 refin = true refout = true xorout = 0x0000 check = 0x3da6 name = (нет)
Когда я перехватываю команду от контроллера, я получаю:
X: 96 10 01 E1 (EE) 01 FF 10 17 | 5F A0 | FE 10 06 E1 96 FE - Последняя строка перед командой Y: E1 10 01 96 (22) 05 01 C0 A8 35 00 10 17 |0B B8| FE 10 06 96 E1 FE
Где (22) - модификатор |0B B8|
это CRC. Как получается 22 из Е4? это еще один CRC?
Когда я отправил одну и ту же команду несколько раз, я перехватил следующее:
Y: E1100196220501C0A8350010170BB8FE100696E1FE Y: E11001962A0501C0A835001017C1C7FE100696E1FE Y: E11001962E0501C0909400101753C8FE100696E1FE Y: E1100196300501809094001017C3EEFE100696E1FE Y: E1100196360501C090940010170D48FE100696E1FE Y: E11001962A0501C09094001017B6F7FE100696E1FE Y: E11001962A0501C09094001017B6F7FE100696E1FE
С помощью reveng
с reveng -w 16 -s
и вышеупомянутые наборы данных, которые я получаю:
width = 16 poly = 0x1021 init = 0xd313 refin = true refout = true xorout = 0x0000 check = 0x295f name = (нет)
Полином одинаков, но init и check различаются, извините за длинный пост, но вот краткое изложение моих вопросов:
1) Обычно ли, например, устройство использует один и тот же многочлен, но разные init и проверку для контроллера?
2) Являются ли строки с постоянным счетом устройства, используемого для смещения байта переменной, используемого для вычисления контрольной суммы? Если да, то как называется этот механизм и какие методы можно использовать для определения взаимосвязи между количеством и байтом?
3) Я на правильном пути или я заблудился?
Спасибо, что нашли время, чтобы прочитать это и был бы признателен за удар в правильном направлении.
1 ответ
Удалите первый байт из ваших последовательностей X и Y, и тогда вы получите оба:
width=16 poly=0x1021 init=0xffff refin=true refout=true xorout=0xffff check=0x906e name="X-25"
Для остроумия:
% reveng -w 16 -s 100196220501C0A8350010170BB8 1001962A0501C0A835001017C1C7 1001962E0501C0909400101753C8 100196300501809094001017C3EE 100196360501C090940010170D48 1001962A0501C09094001017B6F7
width=16 poly=0x1021 init=0xffff refin=true refout=true xorout=0xffff check=0x906e name="X-25"
% reveng -w 16 -s 1001E1E401FF1017F7EC 1001E1E601FF10177FFA 1001E1E801FF1017C79B 1001E1EA01FF10174F8D 1001E1EC01FF1017D7B6 1001E1EE01FF10175FA0
width=16 poly=0x1021 init=0xffff refin=true refout=true xorout=0xffff check=0x906e name="X-25"