Что такое «магическое число» (0xdebb20e3) в APPNOTE pkzip?

В разделе 4.4.7 (CRC-32) APPNOTE.txt вы можете найти

«Магическое число» CRC — 0xdebb20e3.

Однако обычный полином (0x04C11DB7) CRC-32 работает нормально. В битовом отображении это 0xEDB88320. Я не могу понять, что такое 0xdebb20e3.

Я пробовал отразить и инвертировать биты 0xdebb20e3, конвертируя LE → BE и наоборот, не получил 0x04c11db7. 0xc704dd7b (рев.), 0x38fb2284 (инв.+рев.), 0x2144df1c (инв.); даже не похож.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это дополнение к CRC-32 исходного сообщения, любого исходного сообщения, к которому добавляется CRC-32 в порядке прямого порядка байтов.

Итак, если я возьму девятибайтовое сообщение, состоящее из цифр ASCII «123456789», я получу 0xcbf43926. Если затем я возьму 13-байтовое сообщение «123456789», за которым следуют четыре байта 0x26 0x39 0xf4 0xcb, CRC в порядке с прямым порядком байтов, я получу 0x2144df1c. Дополнением к этому является 0xdebb20e3.

Это константа для любого определения CRC и называется «остатком». Вы можете найти его в описании этого CRC здесь (прокрутите вправо до конца строки):

width=32 poly=0x04c11db7 init=0xffffffff refin=true refout=true xorout=0xffffffff check=0xcbf43926 residue=0xdebb20e3 name = "CRC-32/ISO-HDLC"

Остаток — это окончательное содержимое регистра CRC перед последним исключающим «или», которое для этого CRC равно 0xffffffff, отсюда и дополнение. Этот CRC добавляется к сообщению в порядке с прямым порядком байтов, поскольку он отражен (refin=true и refout=true).

Математическое свойство CRC заключается в том, что он является константой для всех сообщений. Его можно использовать для проверки достоверности сообщения, и он часто используется в аппаратных реализациях CRC, где CRC добавляется к сообщению в правильном порядке, и вы просто продолжаете запускать механизм CRC через добавленный CRC и проверять посмотреть, является ли содержимое регистра остатком. Если это не так, то в сообщении и/или добавленном CRC есть ошибка.

Это менее полезно в программных реализациях. Там проще и быстрее просто сравнить CRC в кадре с вычисленным CRC сообщения. Если они не равны, то в сообщении и/или переданном CRC имеется ошибка. Это быстрее, поскольку вам не нужно вычислять CRC еще для четырех байтов, и вам все равно придется выполнять сравнение. Кроме того, именно так вы можете проверить целостность сообщения для любого хеша, тогда как другие хеши обычно не обладают такими математическими свойствами.

Другие вопросы по теме