将uint8_t转换为NSData

时间:2012-08-05 21:28:00

标签: ios rsa nsdata bytebuffer

我已根据Apple Developer网站上提供的示例在IOS应用程序中实现了publickey privatekey RSA加密。

如果我加密并返回uint8_t cipherBuffer,然后从uint8_t cipherBuffer解密,它的效果非常好。但是,我需要将加密数据作为NSData存储到xcdata模型中。

我遇到的问题是可靠地将uint8_t cipherBuffer转换为NSData和/或在解密时将NSData转换回uint8_t。解密的数据似乎被截断了。

这就是我将uint8_t加密缓冲区转换为NSData

的方法
return [NSData dataWithBytesNoCopy:cipherBuffer length:BUFFER_SIZE];

这是我在解密它时将加密的NSData转换回uint8_t缓冲区的方法:

uint8_t *cipherBuffer = (uint8_t*)[cipherText bytes];

3 个答案:

答案 0 :(得分:3)

如果没有看到你如何创建cipherBuffer,很难确切地说它为什么不起作用。但是,从dataWithBytesNoCopy的文档,

  

返回的对象获取字节指针的所有权,并在取消分配时释放它。因此,字节必须指向使用malloc分配的内存块。

如果您只是将cipherBuffer声明为

uint8_t cipherBuffer[BUFFER_SIZE];

它可以解释你的问题。相反,使用malloc:

uint8_t* cipherBuffer = malloc(BUFFER_SIZE);

答案 1 :(得分:2)

谢谢jgh和Jody;

我将加密方法改为malloc缓冲区,并尝试了几种方法将字节写入NSData,最后用:

return [NSData dataWithBytes:(const void *)cipherBuffer length:CIPHER_BUFFER_SIZE];

最终解决问题的方法是改变我在解密方法中创建uint8_t的方式。

const uint8_t *cipherBuffer = (const uint8_t*)[data bytes];

答案 2 :(得分:1)

听起来你正在给它一个原始指针,然后重新使用那个指针。

dataWithBytesNoCopy:想要保留你给它的指针。实际上,你必须给它一个你用malloc创建的指针,因为当它完成数据时它将释放()它。

如果您不希望NSData对象获得所有权,则应使用dataWithBytesNoCopy:length:freeWhenDone: