Что такое «сырой двоичный формат длиной 20»? - PullRequest
2 голосов
/ 02 апреля 2011

Этот вопрос возник у меня при чтении Sha1-PHP Manpage

Там написано:

Если необязательный raw_output установлен в ИСТИНА, тогда дайджест sha1 вместо возвращается в необработанном двоичном формате с длина 20, в противном случае возвращается значение представляет собой шестнадцатеричное число из 40 символов число.

Для меня интуитивно «двоичный формат» представляет собой серию логических значений «истина» или «ложь». Обычно представлены 0 и 1.

Если у вас их 20 и вы интерпретируете их как число, у вас есть диапазон от 2 ^ 20 разных чисел.

Для 40-значного шестнадцатеричного числа это будет 16 ^ 40, что примерно в 1,4 * 10 ^ 42 раз больше, чем 2 ^ 20.

Если вы используете var_dump для необработанного вывода, вы просто получаете искаженные данные, если вы bin2hex, вы получите такое большое шестнадцатеричное число, как описано выше.

Таким образом, мое толкование предмета вопроса определенно бессмысленно. Так что же такое «сырой двоичный формат длиной 20»?

Ответы [ 3 ]

5 голосов
/ 02 апреля 2011

В этом случае «необработанный двоичный файл» означает необработанный байт .

Дайджест SHA-1 имеет длину 160 бит или 20 байтов.

Многие системы используют формат представления ASCII, который состоит из 40 шестнадцатеричных символов, но иногда вам нужны необработанные данные.

DNSSEC, например, использует шестнадцатеричный ASCII при хранении подписей в файле зоны или отображении вывода dig, но вместо этого используется формат «на проводе» в необработанном формате.

1 голос
/ 02 апреля 2011
  • «Необработанный» вывод составляет 20 байт , что составляет до 20 * 8 = 160 битов дайджеста SHA-1.
  • Выход по умолчанию40 символ шестнадцатеричное число, где каждый символ представляет одну шестнадцатеричную цифру (= ​​4 бита), что также добавляет до 4 * 40 = 160 бит.
1 голос
/ 02 апреля 2011

Если у вас есть следующая шестнадцатеричная строка: '8A', она занимает два символа, то есть два байта.

Это то, что sha1() возвращает по умолчанию - с 40 символами вместо двух, конечно.


Если у вас есть значение 138, это целое число, которое занимает только один байт памяти, но оно представляет собой то же самое, поскольку целое число 138 является шестнадцатеричным значением 8A.

Это значение, которое будет возвращено sha1(), если для raw_output установлено значение true - с 20 байтами вместо одного.


При использовании шестнадцатеричной строки для представления целого числа вам нужно два символа для представления значений от 0 до 255 - и эти значения, если они хранятся в виде 8-разрядного целого числа, требуют сохранения только 1 байта.

Вот почему шестнадцатеричная строка, возвращаемая sha1() по умолчанию, составляет 40 байтов, а целочисленное значение, возвращаемое в другом случае, составляет всего 20 байтов.

...