cdespinosa и irsk уже показали вам вашу реальную проблему, поэтому позвольте мне просмотреть вашу расшифровку стенограммы GDB:
(gdb) p digest
$1 = (unsigned char *) 0xa06310e4 "\0206b\260/\336\316^\021\b\a/9\310\225\204"
Вы напечатали digest
как строку C. Здесь вы можете видеть, что эта строка является необработанными байтами; следовательно, все восьмеричные экранирующие символы (например, \020
, \225
) и пара знаков препинания (/
и ^
). Это не печатное шестнадцатеричное представление ASCII, которое вы ожидали. Вам повезло, что в нем не было нулевых байтов; в противном случае вы не напечатали бы весь хеш.
(gdb) po final
Cannot access memory at address 0x0
final
- это nil
. Это имеет смысл, так как ваша строка выше не является допустимой UTF-8; опять же, это просто необработанные байты данных. stringWithUTF8String:
требуется текстовая строка в кодировке UTF-8; Вы не дали его, поэтому он вернулся nil
.
Для передачи необработанных данных вы должны использовать NSData. В этом случае, я думаю, вам нужно шестнадцатеричное представление, поэтому вам нужно создать его самостоятельно так, как показал вам irsk.
Наконец, подумайте, как вам повезло, что ваш ввод не хэшировал действительную строку UTF-8. Если бы это было так, вы бы не заметили эту проблему. Вы можете создать модульный тест для этого метода хеширования с помощью этого ввода.
(gdb) po digest
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0xb0623630
0x98531ed7 in objc_msgSend ()
Сбой программы (специфическая проблема: «неверный доступ», «неверный адрес») в objc_msgSend
. Это потому, что digest
либо вообще не является объектом Какао / CF, либо был одним, но был освобожден. В данном случае это потому, что digest
не является объектом Какао; это массив байтов Си, как показано вашей строкой p digest
выше.
Помните, Objective-C является надмножеством C. Все C существует в нем без изменений. Это означает, что рядом есть C-массивы (например, char []
) и NSArrays Cocoa. Более того, поскольку NSArray происходит из среды Cocoa, а не языка Objective-C, невозможно сделать объекты NSArray взаимозаменяемыми с массивами C: вы не можете использовать оператор индексов для массивов Cocoa и не можете отправить Objective-C сообщения в массивы C.