我正在看一些创建可变数据对象并将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填充为其容量,以用零填充数据。

10-08 12:11