Що таке поліном crc32?


1

Який поліном використовується для crc32? ANSI X3.66 CRC-32 є 0x104C11DB7. Сторінка man для crc32 не вказує на поліном, який він використовує.


Чи можете ви пояснити, як це стосується Ubuntu? Що ти намагаєшся зробити?
— kos

Так, це програма, що входить до пакету libarchive-zip-perl. На сторінці "crc32" є чоловіча сторінка. Сторінка man не вказує поліном, який він використовує для обчислення CRC-32. Він також не вказує на ендеанність байтів, як вони читаються з файлу.
— Люк Перкінс

Вибачте, але, хоча crc32програма включена в Ubuntu, я не вірю, що математичний фон стандартизованого алгоритму CRC32 є темою на AskUbuntu.
— Девід Фоерстер

Математика, ні, це добре зафіксовано у численних підручниках коледжу. Поліном, так. Існує кілька поліномів, які пов'язані з обчисленням 32-бітної CRC. Поліном ідентифікує певний многочлен, який використовується для обчислення, що має важливе значення для перевірки результатів утиліт.
— Люк Перкінс

Відповіді:


5

Питання, як це викладено, є позатематичним, проте я спробую зробити це на тему, вирішивши, як шукати документацію щодо інструментів, які загалом покладаються на модулі Perl; в порядку:

  1. man <tool>;

    Від man crc32:

           This utility is supplied with the Archive::Zip module for Perl.
    
  2. perldoc <module>;

    Від perldoc Archive::Zip:

        Archive::Zip::computeCRC32( $string [, $crc] )
        Archive::Zip::computeCRC32( { string => $string [, checksum => $crc ] } )
            This is a utility function that uses the Compress::Raw::Zlib CRC
            routine to compute a CRC-32.
    

    Застосовувати рекурсивно, поки щось не вдасться або не буде досягнуто "root" модуля; у цьому випадку рекурсія закінчується тим perldoc Compress::Raw::Zlib, що не вдасться;

  3. Копайте вихідний код модуля "root" :

    Створіть таблиці для байтового 32-бітного обчислення CRC на поліномі: x ^ 32 + x ^ 26 + x ^ 23 + x ^ 22 + x ^ 16 + x ^ 12 + x ^ 11 + x ^ 10 + x ^ 8 + х ^ 7 + х ^ 5 + х ^ 4 + х ^ 2 + х + 1.

    Поліноми над GF (2) представлені у двійкових, один біт на коефіцієнт, з найнижчою потужністю у найбільш значущому біті. Тоді додавання многочленів є просто винятковою або, а множення многочлена на x - це правильний зсув на одиницю. Якщо ми називаємо наведений многочлен p і представляємо байт як многочлен q, також з найнижчою потужністю у найбільш значущому біті (тому байт 0xb1 є многочленом x ^ 7 + x ^ 3 + x + 1), то CRC є (q * x ^ 32) mod p, де mod b означає залишок після ділення a на b.

    Цей обчислення проводиться за допомогою методу зсувного регістру множення та отримання решти. Реєстр ініціалізується до нуля, і для кожного вхідного біта x ^ 32 додається mod p до реєстру, якщо біт є одиничним (де x ^ 32 mod p - p + x ^ 32 = x ^ 26 + ... +1), і регістр помножується на mod p на x (що зміщується вправо на одиницю і додає x ^ 32 mod p, якщо біт зміщений на один). Починаємо з найвищої потужності (найменш значущого біта) q і повторюємо для всіх восьми біт q.

    Перша таблиця - це просто CRC усіх можливих восьми бітових значень. Це вся інформація, необхідна для генерування CRC на байті даних одночасно для всіх комбінацій значень реєстру CRC та вхідних байтів. У решті таблиць передбачено обчислення CRC за словом одночасно як для машин з великим ендіанієм, так і для малих ендіанців, де слово - чотири байти.


Коротше кажучи, поліном дорівнює 0x104C11DB7. Він реалізує ANSI X3.66 CRC-32. Було б добре, якби сторінка man crc32 включила цю прозу.
— Люк Перкінс

1
@LukePerkins розгляне можливість подання звіту про помилку.
— муру

@muru: Я б хотів. Не інтуїтивно зрозуміло, як це зробити. Мені не вистачає "балів".
— Люк Перкінс

1
@LukePerkins Ви не вказуєте балів (все-таки не на цьому сайті). Дивіться askubuntu.com/a/5126/158442 , по суті: запустити ubuntu-bug libarchive-zip-perl.
— муру

@muru: Дякую Це працює. Готово
— Люк Перкінс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.