Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 04.05.2013
Сообщений: 58

CRC24

23.04.2014, 21:14. Показов 1947. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет, требуется реализовать циклический избыточный код на основе CRC-24. В данном алгоритме следующие значения:
Name Identifier-name, Poly Reverse Init-value XOR-out Check
'crc-24', ‘Crc24’, 0x1864CFB, NON_REVERSE, 0xB704CE, 0x000000, 0x21CF02

При проверке файла txt, содержащего “123456789” должен быть результат 0x21CF02.

первый модуль:

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
44
45
46
47
48
49
class CRC24():
    CRC24_TABLE = (
    0x000000, 0x864cfb, 0x8ad50d, 0x0c99f6, 0x93e6e1, 0x15aa1a, 0x1933ec,
    0x9f7f17, 0xa18139, 0x27cdc2, 0x2b5434, 0xad18cf, 0x3267d8, 0xb42b23,
    0xb8b2d5, 0x3efe2e, 0xc54e89, 0x430272, 0x4f9b84, 0xc9d77f, 0x56a868,
    0xd0e493, 0xdc7d65, 0x5a319e, 0x64cfb0, 0xe2834b, 0xee1abd, 0x685646,
    0xf72951, 0x7165aa, 0x7dfc5c, 0xfbb0a7, 0x0cd1e9, 0x8a9d12, 0x8604e4,
    0x00481f, 0x9f3708, 0x197bf3, 0x15e205, 0x93aefe, 0xad50d0, 0x2b1c2b,
    0x2785dd, 0xa1c926, 0x3eb631, 0xb8faca, 0xb4633c, 0x322fc7, 0xc99f60,
    0x4fd39b, 0x434a6d, 0xc50696, 0x5a7981, 0xdc357a, 0xd0ac8c, 0x56e077,
    0x681e59, 0xee52a2, 0xe2cb54, 0x6487af, 0xfbf8b8, 0x7db443, 0x712db5,
    0xf7614e, 0x19a3d2, 0x9fef29, 0x9376df, 0x153a24, 0x8a4533, 0x0c09c8,
    0x00903e, 0x86dcc5, 0xb822eb, 0x3e6e10, 0x32f7e6, 0xb4bb1d, 0x2bc40a,
    0xad88f1, 0xa11107, 0x275dfc, 0xdced5b, 0x5aa1a0, 0x563856, 0xd074ad,
    0x4f0bba, 0xc94741, 0xc5deb7, 0x43924c, 0x7d6c62, 0xfb2099, 0xf7b96f,
    0x71f594, 0xee8a83, 0x68c678, 0x645f8e, 0xe21375, 0x15723b, 0x933ec0,
    0x9fa736, 0x19ebcd, 0x8694da, 0x00d821, 0x0c41d7, 0x8a0d2c, 0xb4f302,
    0x32bff9, 0x3e260f, 0xb86af4, 0x2715e3, 0xa15918, 0xadc0ee, 0x2b8c15,
    0xd03cb2, 0x567049, 0x5ae9bf, 0xdca544, 0x43da53, 0xc596a8, 0xc90f5e,
    0x4f43a5, 0x71bd8b, 0xf7f170, 0xfb6886, 0x7d247d, 0xe25b6a, 0x641791,
    0x688e67, 0xeec29c, 0x3347a4, 0xb50b5f, 0xb992a9, 0x3fde52, 0xa0a145,
    0x26edbe, 0x2a7448, 0xac38b3, 0x92c69d, 0x148a66, 0x181390, 0x9e5f6b,
    0x01207c, 0x876c87, 0x8bf571, 0x0db98a, 0xf6092d, 0x7045d6, 0x7cdc20,
    0xfa90db, 0x65efcc, 0xe3a337, 0xef3ac1, 0x69763a, 0x578814, 0xd1c4ef,
    0xdd5d19, 0x5b11e2, 0xc46ef5, 0x42220e, 0x4ebbf8, 0xc8f703, 0x3f964d,
    0xb9dab6, 0xb54340, 0x330fbb, 0xac70ac, 0x2a3c57, 0x26a5a1, 0xa0e95a,
    0x9e1774, 0x185b8f, 0x14c279, 0x928e82, 0x0df195, 0x8bbd6e, 0x872498,
    0x016863, 0xfad8c4, 0x7c943f, 0x700dc9, 0xf64132, 0x693e25, 0xef72de,
    0xe3eb28, 0x65a7d3, 0x5b59fd, 0xdd1506, 0xd18cf0, 0x57c00b, 0xc8bf1c,
    0x4ef3e7, 0x426a11, 0xc426ea, 0x2ae476, 0xaca88d, 0xa0317b, 0x267d80,
    0xb90297, 0x3f4e6c, 0x33d79a, 0xb59b61, 0x8b654f, 0x0d29b4, 0x01b042,
    0x87fcb9, 0x1883ae, 0x9ecf55, 0x9256a3, 0x141a58, 0xefaaff, 0x69e604,
    0x657ff2, 0xe33309, 0x7c4c1e, 0xfa00e5, 0xf69913, 0x70d5e8, 0x4e2bc6,
    0xc8673d, 0xc4fecb, 0x42b230, 0xddcd27, 0x5b81dc, 0x57182a, 0xd154d1,
    0x26359f, 0xa07964, 0xace092, 0x2aac69, 0xb5d37e, 0x339f85, 0x3f0673,
    0xb94a88, 0x87b4a6, 0x01f85d, 0x0d61ab, 0x8b2d50, 0x145247, 0x921ebc,
    0x9e874a, 0x18cbb1, 0xe37b16, 0x6537ed, 0x69ae1b, 0xefe2e0, 0x709df7,
    0xf6d10c, 0xfa48fa, 0x7c0401, 0x42fa2f, 0xc4b6d4, 0xc82f22, 0x4e63d9,
    0xd11cce, 0x575035, 0x5bc9c3, 0xdd8538
)
def _crc24(data, CRC24_TABLE):
    table = CRC24_TABLE
    crc = crc & 0xFFFFFF
    for x in data:
        crc = table[ord(x) ^ (int(crc>>16) & 0xFF)] ^ ((crc << 8) & 0xFFFF00)
    return crc
    def _crc24_file(self, filename):
        f = open(filename, 'r')
        return self._crc24(f.readlines())
Не понимаю как сделать второй модуль, где идет проверка моего файла…
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
from module1 import CRC24
import unittest
class TestCRC24(unittest.TestCase):
    def setUp(self):
        self._crc24 = CRC24()
    def test_crc(self):
        expected_crc = '0x21CF02'
##        actual_crc = self.crc24._crc24_file('')
##        self.assertEqual(actual_crc, expected_crc)
        with open('C:\\Users\\Admin\\Desktop\\1.txt', 'rb') as fd:
            return self._crc24(fd.read)
        self.assertEqual(_crc24, expected_crc)
if __name__ == '__main__':
    unittest.main()
Как правильно сделать второй модуль, чтобы добиться результата? В готовом модуле (https://pypi.python.org/pypi/crcmod/1.7) очень много всего, я python только 3 раз берусь, поэтому мне нужно максимально упрощенно все сделать. Спасибо!
0
Лучшие ответы (1)
363 / 334 / 38
Регистрация: 29.03.2011
Сообщений: 838
23.04.2014, 22:23
terebob,
a. Методы, которые начинаются с "_" - не публичные (аналог protected из других языков), т.е. как-то снаружи с классом работать нельзя.
b. У вашего класса CRC24 нет конструктора( __init__(self, *args) ), его нельзя вызвать, как функцию ( __call__(self, *args) ), поэтому 11я строка self._crc24(fd.read) должна вывалиться с ошибкой.
c. 1м аргументом в метод класса надо передавать ссылку на себя (self).
d. Зачем вы создаёте свойство класса CRC24_TABLE? оно же у вас нигде не используется..
e. Методы в unittest.TestCase не должны ничего возвращать (11я строка).
...
Там ещё много мелких ляпов, похоже, вам стоит любой из учебников для новичков почитать.
Конкретно по unittest-ам когда-то мне вот эта глава очень пригодилась.
0
 Аватар для Zuzik
298 / 256 / 57
Регистрация: 11.06.2012
Сообщений: 1,557
23.04.2014, 23:20
Цитата Сообщение от sKotenok Посмотреть сообщение
a. Методы, которые начинаются с "_" - не публичные (аналог protected из других языков), т.е. как-то снаружи с классом работать нельзя.
Хм, можно немного подробнее? Ибо как я читал методы начинающиеся с "__" просто принято не использовать, но тем не менее все эти методы спокойно можно вызвать снаружи. Судя по вашим словам их снаружи вызвать нельзя. Какой из вариантов правильный?
0
0 / 0 / 0
Регистрация: 04.05.2013
Сообщений: 58
23.04.2014, 23:26  [ТС]
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
44
45
46
47
class CRC24():
 
    def __init__(self):
        self.CRC24_TABLE = (
                0x000000, 0x864cfb, 0x8ad50d, 0x0c99f6, 0x93e6e1, 0x15aa1a, 0x1933ec,
                0x9f7f17, 0xa18139, 0x27cdc2, 0x2b5434, 0xad18cf, 0x3267d8, 0xb42b23,
                0xb8b2d5, 0x3efe2e, 0xc54e89, 0x430272, 0x4f9b84, 0xc9d77f, 0x56a868,
                0xd0e493, 0xdc7d65, 0x5a319e, 0x64cfb0, 0xe2834b, 0xee1abd, 0x685646,
                0xf72951, 0x7165aa, 0x7dfc5c, 0xfbb0a7, 0x0cd1e9, 0x8a9d12, 0x8604e4,
                0x00481f, 0x9f3708, 0x197bf3, 0x15e205, 0x93aefe, 0xad50d0, 0x2b1c2b,
                0x2785dd, 0xa1c926, 0x3eb631, 0xb8faca, 0xb4633c, 0x322fc7, 0xc99f60,
                0x4fd39b, 0x434a6d, 0xc50696, 0x5a7981, 0xdc357a, 0xd0ac8c, 0x56e077,
                0x681e59, 0xee52a2, 0xe2cb54, 0x6487af, 0xfbf8b8, 0x7db443, 0x712db5,
                0xf7614e, 0x19a3d2, 0x9fef29, 0x9376df, 0x153a24, 0x8a4533, 0x0c09c8,
                0x00903e, 0x86dcc5, 0xb822eb, 0x3e6e10, 0x32f7e6, 0xb4bb1d, 0x2bc40a,
                0xad88f1, 0xa11107, 0x275dfc, 0xdced5b, 0x5aa1a0, 0x563856, 0xd074ad,
                0x4f0bba, 0xc94741, 0xc5deb7, 0x43924c, 0x7d6c62, 0xfb2099, 0xf7b96f,
                0x71f594, 0xee8a83, 0x68c678, 0x645f8e, 0xe21375, 0x15723b, 0x933ec0,
                0x9fa736, 0x19ebcd, 0x8694da, 0x00d821, 0x0c41d7, 0x8a0d2c, 0xb4f302,
                0x32bff9, 0x3e260f, 0xb86af4, 0x2715e3, 0xa15918, 0xadc0ee, 0x2b8c15,
                0xd03cb2, 0x567049, 0x5ae9bf, 0xdca544, 0x43da53, 0xc596a8, 0xc90f5e,
                0x4f43a5, 0x71bd8b, 0xf7f170, 0xfb6886, 0x7d247d, 0xe25b6a, 0x641791,
                0x688e67, 0xeec29c, 0x3347a4, 0xb50b5f, 0xb992a9, 0x3fde52, 0xa0a145,
                0x26edbe, 0x2a7448, 0xac38b3, 0x92c69d, 0x148a66, 0x181390, 0x9e5f6b,
                0x01207c, 0x876c87, 0x8bf571, 0x0db98a, 0xf6092d, 0x7045d6, 0x7cdc20,
                0xfa90db, 0x65efcc, 0xe3a337, 0xef3ac1, 0x69763a, 0x578814, 0xd1c4ef,
                0xdd5d19, 0x5b11e2, 0xc46ef5, 0x42220e, 0x4ebbf8, 0xc8f703, 0x3f964d,
                0xb9dab6, 0xb54340, 0x330fbb, 0xac70ac, 0x2a3c57, 0x26a5a1, 0xa0e95a,
                0x9e1774, 0x185b8f, 0x14c279, 0x928e82, 0x0df195, 0x8bbd6e, 0x872498,
                0x016863, 0xfad8c4, 0x7c943f, 0x700dc9, 0xf64132, 0x693e25, 0xef72de,
                0xe3eb28, 0x65a7d3, 0x5b59fd, 0xdd1506, 0xd18cf0, 0x57c00b, 0xc8bf1c,
                0x4ef3e7, 0x426a11, 0xc426ea, 0x2ae476, 0xaca88d, 0xa0317b, 0x267d80,
                0xb90297, 0x3f4e6c, 0x33d79a, 0xb59b61, 0x8b654f, 0x0d29b4, 0x01b042,
                0x87fcb9, 0x1883ae, 0x9ecf55, 0x9256a3, 0x141a58, 0xefaaff, 0x69e604,
                0x657ff2, 0xe33309, 0x7c4c1e, 0xfa00e5, 0xf69913, 0x70d5e8, 0x4e2bc6,
                0xc8673d, 0xc4fecb, 0x42b230, 0xddcd27, 0x5b81dc, 0x57182a, 0xd154d1,
                0x26359f, 0xa07964, 0xace092, 0x2aac69, 0xb5d37e, 0x339f85, 0x3f0673,
                0xb94a88, 0x87b4a6, 0x01f85d, 0x0d61ab, 0x8b2d50, 0x145247, 0x921ebc,
                0x9e874a, 0x18cbb1, 0xe37b16, 0x6537ed, 0x69ae1b, 0xefe2e0, 0x709df7,
                0xf6d10c, 0xfa48fa, 0x7c0401, 0x42fa2f, 0xc4b6d4, 0xc82f22, 0x4e63d9,
                0xd11cce, 0x575035, 0x5bc9c3, 0xdd8538)
 
    def get_crc24(self, data):
        crc = 0xFFFFFF
        for x in data:
            crc = (self.CRC24_TABLE[ord(x) ^ (int(crc>>16) & 0xFF)]) ^ ((crc << 8) & 0xFFFF00)
        return hex(crc & 0xFFFFFF)
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from module1 import CRC24
import unittest
 
class TestCRC24(unittest.TestCase):
 
    def setUp(self):
        self.crc24 = CRC24()
 
    def test_crc(self):
        expected_crc = '0x21CF02'
        print expected_crc
        massege = '123456789'
        actual_crc = self.crc24.get_crc24(massege)
        print actual_crc
        self.assertEqual(actual_crc, expected_crc)
 
if __name__ == '__main__':
    unittest.main()
Так алгоритм работает, но неправильно считает сумму, как правильно записать в первом модуле вычисление хеша, чтобы во 2 модуле не ругалось.. Ниже нужный алгоритм, взятый из python

Python
1
2
3
4
5
6
def _crc24(data, CRC24_TABLE):
    table = CRC24_TABLE
    crc = crc & 0xFFFFFF
    for x in data:
        crc = table[ord(x) ^ (int(crc>>16) & 0xFF)] ^ ((crc << 8) & 0xFFFF00)
    return crc
0
363 / 334 / 38
Регистрация: 29.03.2011
Сообщений: 838
24.04.2014, 14:35
Лучший ответ Сообщение было отмечено terebob как решение

Решение

Zuzik, принято, что имена, обрамлённые "__" с двух сторон означают "тут какая-то магия" (интерпретатор, увидев такой метод в опред. контексте делает что-то не следующее явно из кода, например __init__(self) - конструктор класса и т.п.). Не желательно такие самому создавать, чтобы не было конфликтов и чтобы не путать остальных.
Имена, начинающиеся с "__" - не экспортируются явно во внешнюю область видимости. К ним можно обратиться при особом желании, но это сделать будет сложнее (через instance.__dict__('__name') или через insctance._ClassName__name). Это аналог private.
Имена, начинающиеся с "_" - можно вызывать из-вне, но принято, что они относятся к внутренней реализации (например если есть какая-то _property, принято делать getter/setter и уже через них с этим свойством работать).
Другими словами этим ты говоришь пользователю класса: чувак, этот метод/свойство не трогай, но если очень надо - хрен с тобой, с меня потом не спрашивай. Т.е. аналог protected.

terebob, давай разбираться.
последний код, что ты привел - не будет работать, т.к.:
Python
1
crc = crc & 0xFFFFFF
А откуда эта переменная берётся - неизвестно.
Но я нагуглил pgpdump, из которого ты скорее всего и взял свою функцию.
Если ещё там посмотреть, то data - это bytearray, тогда получаем:
Python
1
2
3
4
5
6
7
8
9
10
def crc24(self, data): # Пусть это будет метод класса..
    '''Implementation of the CRC-24 algorithm used by OpenPGP.'''
    data = bytearray(data) # Конвертим входные данные в bytearray
    crc = 0x00b704ce # Не знаю, что это за константа.
    for byte in data:
        crc = (self.CRC24_TABLE[((crc >> 16) ^ byte) & 0xff] ^ (crc << 8)) & 0x00ffffff
    return crc
 
print '{:#x}'.format(CRC24().crc24("123456789"))
# 0x21cf02 - что и требовалось..
1
0 / 0 / 0
Регистрация: 04.05.2013
Сообщений: 58
24.04.2014, 18:33  [ТС]
sKotenok, Можете еще подсказать, как нужно сделать во втором модуле данную строку, чтобы во 2 модуле сравнивало контрольные суммы actual_crc = self.crc24.crc24(massege)
ошибку выдает CRC24 instance has no attribute 'crc24'
0
0 / 0 / 0
Регистрация: 04.05.2013
Сообщений: 58
26.04.2014, 18:02  [ТС]
Проблема решена, можете сказать как сделать в этой строке
Python
1
return crc
равноценно тому что вы прописали
Python
1
print '{:#x}'.format(CRC24().crc24("123456789"))
Если просто дописать hex(crc) значения не совпадают, выдает следующее 0x21cf02L, интересно почему еще добавляется L
0
363 / 334 / 38
Регистрация: 29.03.2011
Сообщений: 838
26.04.2014, 19:11
terebob, L означает Long, это часть форматирования, а не самого числа. (Так же как и 0x спереди)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ответ Создать тему
Новые блоги и статьи
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru