Що таке поліном 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.