Форум программистов, компьютерный форум, киберфорум
Python: Научные вычисления
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
 Аватар для gippus
1 / 1 / 0
Регистрация: 05.07.2023
Сообщений: 6

Рассчет контрольной суммы по алгоритму CRC8

12.07.2023, 22:19. Показов 3088. Ответов 9

Студворк — интернет-сервис помощи студентам
Есть задание, довольно странное, но ладно. Необходимо рассчитать контрольную сумму json элемента по алгоритму CRC8 на python. Есть пример:
У следующего словаря контрольная сумма равна 138 байтам, это все что известно.

Python
1
2
3
4
5
6
7
8
9
10
"payload": {
            "src": 819,
            "dst": 16383,
            "serial": 1,
            "dev_type": 6,
            "cmd": 6,
            "cmd_body": {
                "timestamp": 1688984021000
            }
}
Вообще контрольная сумма нужна, чтобы проверять дошли ли все данные до получателя. Я с этой темой впервые сталкиваюсь, весь день уже пытаюсь разобраться, но инфы в инете мало. Может кто подскажет алгоритм хотя бы, код уже сам напишу. Нашел статейку, может кому поможет - http://www.sunshine2k.de/artic... c.html#ch4
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.07.2023, 22:19
Ответы с готовыми решениями:

Проверка контрольной суммы crc8
народ, подскажите как сделать проверку контрольной суммы допустим поступают байты: 170 7 0 0 7 102 230 96 68 115 0- синхробайт ...

Что нужно переделать, чтобы расчёт контрольной суммы был в CRC8?
class Program { static void CRC(string line) { if (string.IsNullOrWhiteSpace(line)) {...

Код по алгоритму. Расчет контрольной суммы
Помогите написать код по этому алгоритму. 1) Пользователь может выбрать ввод 8-ми или на 13-ти чисел.(вводит их сам) 2) Сложить...

9
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
14.07.2023, 12:13
Цитата Сообщение от gippus Посмотреть сообщение
Вообще контрольная сумма нужна, чтобы проверять дошли ли все данные до получателя.
И не только, а так же удостовериться что не было ни каких вмешательств из вне (подмена данных и т.д.).

Цитата Сообщение от gippus Посмотреть сообщение
Может кто подскажет алгоритм хотя бы, код уже сам напишу.
А почему нельзя использовать готовые решения?

Есть еще пример данных?

Добавлено через 1 минуту
Цитата Сообщение от gippus Посмотреть сообщение
У следующего словаря контрольная сумма равна 138 байтам
Не 138 байтам, а просто 138. CRC8 - восьмерка говорит о том, что контрольная сумма имеет размер 1 байта.
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
14.07.2023, 13:32
странно, вроде я уже писал в этой теме или подобной - где у вас проблемы с данными, на каком этапе возникают? Самописные протоколы?
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
14.07.2023, 13:45
Лучший ответ Сообщение было отмечено Catstail как решение

Решение

gippus, учитывая выходное значение, тут применяется не простой CRC8, а CRC-8/EBU

Добавлено через 7 минут
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
CRC8_EBU_TABLE = [
   0x00, 0x64, 0xc8, 0xac, 0xe1, 0x85, 0x29, 0x4d,
   0xb3, 0xd7, 0x7b, 0x1f, 0x52, 0x36, 0x9a, 0xfe,
   0x17, 0x73, 0xdf, 0xbb, 0xf6, 0x92, 0x3e, 0x5a,
   0xa4, 0xc0, 0x6c, 0x08, 0x45, 0x21, 0x8d, 0xe9,
   0x2e, 0x4a, 0xe6, 0x82, 0xcf, 0xab, 0x07, 0x63,
   0x9d, 0xf9, 0x55, 0x31, 0x7c, 0x18, 0xb4, 0xd0,
   0x39, 0x5d, 0xf1, 0x95, 0xd8, 0xbc, 0x10, 0x74,
   0x8a, 0xee, 0x42, 0x26, 0x6b, 0x0f, 0xa3, 0xc7,
   0x5c, 0x38, 0x94, 0xf0, 0xbd, 0xd9, 0x75, 0x11,
   0xef, 0x8b, 0x27, 0x43, 0x0e, 0x6a, 0xc6, 0xa2,
   0x4b, 0x2f, 0x83, 0xe7, 0xaa, 0xce, 0x62, 0x06,
   0xf8, 0x9c, 0x30, 0x54, 0x19, 0x7d, 0xd1, 0xb5,
   0x72, 0x16, 0xba, 0xde, 0x93, 0xf7, 0x5b, 0x3f,
   0xc1, 0xa5, 0x09, 0x6d, 0x20, 0x44, 0xe8, 0x8c,
   0x65, 0x01, 0xad, 0xc9, 0x84, 0xe0, 0x4c, 0x28,
   0xd6, 0xb2, 0x1e, 0x7a, 0x37, 0x53, 0xff, 0x9b,
   0xb8, 0xdc, 0x70, 0x14, 0x59, 0x3d, 0x91, 0xf5,
   0x0b, 0x6f, 0xc3, 0xa7, 0xea, 0x8e, 0x22, 0x46,
   0xaf, 0xcb, 0x67, 0x03, 0x4e, 0x2a, 0x86, 0xe2,
   0x1c, 0x78, 0xd4, 0xb0, 0xfd, 0x99, 0x35, 0x51,
   0x96, 0xf2, 0x5e, 0x3a, 0x77, 0x13, 0xbf, 0xdb,
   0x25, 0x41, 0xed, 0x89, 0xc4, 0xa0, 0x0c, 0x68,
   0x81, 0xe5, 0x49, 0x2d, 0x60, 0x04, 0xa8, 0xcc,
   0x32, 0x56, 0xfa, 0x9e, 0xd3, 0xb7, 0x1b, 0x7f,
   0xe4, 0x80, 0x2c, 0x48, 0x05, 0x61, 0xcd, 0xa9,
   0x57, 0x33, 0x9f, 0xfb, 0xb6, 0xd2, 0x7e, 0x1a,
   0xf3, 0x97, 0x3b, 0x5f, 0x12, 0x76, 0xda, 0xbe,
   0x40, 0x24, 0x88, 0xec, 0xa1, 0xc5, 0x69, 0x0d,
   0xca, 0xae, 0x02, 0x66, 0x2b, 0x4f, 0xe3, 0x87,
   0x79, 0x1d, 0xb1, 0xd5, 0x98, 0xfc, 0x50, 0x34,
   0xdd, 0xb9, 0x15, 0x71, 0x3c, 0x58, 0xf4, 0x90,
   0x6e, 0x0a, 0xa6, 0xc2, 0x8f, 0xeb, 0x47, 0x23
]
 
 
def crc8_ebu(bytearr: bytes) -> bytes:
    reminder = 0xFF
    for byte in bytearr:
        reminder = CRC8_EBU_TABLE[(byte ^ reminder) & 0xFF]
    return int.to_bytes(reminder, 1, "big")
 
print(crc8_ebu(b'''{"payload": {"src": 819, "dst": 16383, "serial": 1, "dev_type": 6, "cmd": 6, "cmd_body": {"timestamp": 1688984021000}}}'''))
3
5516 / 2869 / 571
Регистрация: 07.11.2019
Сообщений: 4,760
14.07.2023, 15:58
Fudthhh, ничто не помешает злоумышленнику прочитать сообщение и/или подменить сообщение и также подсчитать для него crc-8. Все-таки crc больше предназначено для проверки целосостни данных, а не шифрования.
0
 Аватар для gippus
1 / 1 / 0
Регистрация: 05.07.2023
Сообщений: 6
15.07.2023, 00:55  [ТС]
Извините, намудрил с входными данными. Нужно посчитать контрольную сумму не json элемента, а списка с данными, которые в дальнейшем отправляю на сервер. Вот пример:
DAH_fwEBAQVIVUIwMeE - так выглядит зашифрованное сообщение в base64, конечный итог, к которому нужно прийти, именно оно отправляется на сервак. Сам пакет имеет следующую структуру:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
packet = {
        "length": 12,
        "payload": {
            "src": 1,
            "dst": 16383,
            "serial": 1,
            "dev_type": 1,
            "cmd": 1,
            "cmd_body": {
                "dev_name": "HUB01"
            }
        },
        "crc8": 225
}
Json формат представлен для удобства, на самом деле данные уложены там в виде списка: [12, 1, 16383, 1, 1, 1, 'HUB01', 225], некоторые элементы кодируются в другие форматы, но это не важно, итоговый пакет перед кодировкой в base64 выглядит так - [12, 1, 255, 127, 1, 1, 1, 5, 72, 85, 66, 48, 49, 225]. Так вот, нужно рассчитать контрольную сумму элемента payload, то есть списка [1, 255, 127, 1, 1, 1, 5, 72, 85, 66, 48, 49] и записать его в элемент crc8 (последний в списке).
Я уже перепробовал все варианты и 225 уж никак не может получиться. Считал и с помощью библиотеки crc8, и лично при помощи таблицы (нашел код этой библиотеки - https://github.com/niccokunzma... er/crc8.py). В итоге получается 90.
Пример здесь использовал другой, с примером, который используется в теме аналогичная ситуация
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
15.07.2023, 11:26
ау, хьюстон, есть кто на связи? вы где данные то теряете? используете самописные протоколы не поверх тсп? нафига козе баян короче?
0
 Аватар для gippus
1 / 1 / 0
Регистрация: 05.07.2023
Сообщений: 6
15.07.2023, 12:06  [ТС]
Цитата Сообщение от Welemir1 Посмотреть сообщение
ау, хьюстон, есть кто на связи? вы где данные то теряете? используете самописные протоколы не поверх тсп? нафига козе баян короче?
Задание на лето дали - реализовать модель хаба для умного дома на питоне. В условии есть, что не все данные целостно доходят до сервера, поэтому нужно реализовать проверку на crc8, но чтобы ее реализовать, надо ее правильно посчитать хотя бы, как в примере
1
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
15.07.2023, 16:10
gippus, понял, ок, но я бы спросил -а как имено тогда данные идут и может выбрать другой протокол?)
0
 Аватар для gippus
1 / 1 / 0
Регистрация: 05.07.2023
Сообщений: 6
15.07.2023, 20:15  [ТС]
Все, разобрался в вопросе. Видимо там используется алгоритм не совсем оригинального crc8, а его подвида. Использовал доп библиотеку libscrc и методом перебора нашел верный вариант. Вот ссылка на библиотеку, может кому и поможет в будущем - https://github.com/christhechris/libscrc
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.07.2023, 20:15
Помогаю со студенческими работами здесь

Рассчет суммы
Здравствуйте! <?php $mysqlconn = mysql_connect('', '', ''); // Подключаемся к БД if (!$mysqlconn) // Ошибка подключения { ...

Рассчёт суммы
В БД Access настроил вычисления ""Сумма: (*)-(**/100)"" Всё рассчитывает в access. В project захожу, компилирую, в dbgrid добавляю или...

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

Подсчёт контрольной суммы
Приветствую! Необходимо подсчитать 32-битную сумму для файла checksum = word1 + word2 + ... + wordN. Я недавно читал про little-...

Расчет контрольной суммы
Здравствуйте! Помогите востановить алгоритм расчета контрольной суммы в прошивке IP телефонов. Когда в телефоне ломается флеш-память -...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru