Вы не можете хранить 128-битное значение в int
(если int
не меньше 128 бит в вашей реализации C, что, я уверен, предсказывает, что это не так).То же самое касается long long
, самого большого стандартного целочисленного типа.
Десятичное значение, которое вы напечатали, равно «254» (десятичное для 0xfe
), за которым следует «23» (десятичное для 0x17
), и так далее.Это в основном бессмысленно - если вы представляете либо 0x010001
, либо 0x0A01
, как это, вы получите ту же строку, 101
.Вы получили 36 цифр, потому что это общее количество десятичных цифр в каждом из 16-байтовых значений.
Вы напечатали шестнадцатеричное значение длиной 32 символа (4 бита на символ, 32 символа, 128биты).Это на самом деле немного удачи, каждый байт в вашем дайджесте, по крайней мере, равен 0x10
.Вы должны печатать с %02x
, чтобы включить отрыв 0 для небольших значений.
Если вы хотите представить 128-битное значение в виде десятичной строки, то вам нужна либо библиотека bignum, либо длинное деление.Но бессмысленно выражать контрольные суммы MD5 в десятичном виде: когда люди представляют их в виде строк, они всегда используют шестнадцатеричные значения.
Было бы хорошо, если бы кто-то мог объяснить, как значения хранятся в неподписанном символе
8 битов дайджеста в каждом unsigned char
, 16 беззнаковых символов в массиве, составляет 128 битов.Вы не можете использовать sscanf
или strtol
, потому что значение, хранящееся в MD5Final
, не является строкой.