2012-06-29 2 views
0

Я ищу код, который создает изменяемый объект данных и помещает в него хэш SHA1. Если я инициализирую целевой изменяемый объект данных с помощьюРазница между [[NSMutableData alloc] initWithLength:] и CFDataCreateMutable()?

CFMutableDataRef hashDataRef = (CFMutableDataRef)[[NSMutableData alloc] initWithLength:SHA_DIGEST_LENGTH]; 

все работает нормально. Если я изменяю, что одна линия

CFMutableDataRef hashDataRef = CFDataCreateMutable(kCFAllocatorDefault, SHA_DIGEST_LENGTH); 

он ломает (изменяемые объект данных, как представляется, по-прежнему быть пустым после команды SHA1). В обоих случаях, линия, которая следует за создание hashDataRef является

SHA1(CFDataGetBytePtr(inputDataRef), CFDataGetLength(inputDataRef), CFDataGetMutableBytePtr(hashDataRef)); 

Я не ожидал, что там будет какая-то разница между этими двумя, но ясно, что я что-то не хватает. Есть ли правильный способ Core Foundation для получения изменяемого объекта данных, который я хочу, без использования NSMutableData и бесплатного моста?

ответ

3

NSMutableData initWithLength: создает объект данных, необработанные данные которого заполняются нулями, но CFDataCreateMutable создает пустой CFMutableDataRef. Несмотря на то, что он был создан с пропускной способностью, его длина все равно равна нулю. Итак, когда вы используете CFDataGetMutableBytePtr, он возвращает указатель NULL.

Чтобы исправить это, вы можете заполнить CFMutableDataRef своей емкостью, используя CFDataSetLength, который заполняет данные нулями.

+3

Возможно, стоит отметить, что 'CFDataCreateMutable()' больше похож на '- [NSMutableData initWithCapacity:]'. –

+1

Собственно, это сходство вводит в заблуждение. Емкость 'CFDataCreateMutable()' является строгим пределом. «Емкость» '- [NSMutableData initWithCapacity:]' является лишь нижней границей распределения * first * (когда это происходит), но не препятствует тому, чтобы объект вырос из этого. Это в основном просто оптимизация. –

Смежные вопросы