我正在看一些创建可变数据对象并将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和免费电话桥接?
最佳答案
NSMutableData initWithLength:
创建一个数据对象,其原始数据用零填充,但是CFDataCreateMutable
创建一个空的CFMutableDataRef
。即使创建时具有容量,其长度仍为零。因此,当您使用CFDataGetMutableBytePtr
时,它将返回一个NULL指针。
要解决此问题,您可以使用CFDataSetLength将CFMutableDataRef填充为其容量,以用零填充数据。