我正在查看一些创建可变数据对象的代码,并将SHA1哈希放入其中。如果我使用
初始化目标可变数据对象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和免费桥接?
答案 0 :(得分:3)
NSMutableData initWithLength:
创建一个数据对象,其原始数据用零填充,但CFDataCreateMutable
创建一个空CFMutableDataRef
。尽管它是用容量创建的,但它的长度仍为零。因此,当您使用CFDataGetMutableBytePtr
时,它会返回NULL指针。
要解决此问题,您可以使用CFDataSetLength将CFMutableDataRef填充到其容量中,这会使用零填充数据。