【问题标题】:convert uint8_t to NSData将 uint8_t 转换为 NSData
【发布时间】:2012-08-05 21:27:59
【问题描述】:

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

如果我加密并返回uint8_t cipherBuffer,然后从uint8_t cipherBuffer 解密,它会完美运行。但是我需要将加密的数据存储到.xcdata 模型中作为NSData

我遇到的问题是将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];

【问题讨论】:

  • 只是为了确保 cipherBuffer 是一个在方法内部 malloc 的缓冲区?
  • 您是在使用自动(函数范围)数组还是 malloc 一些内存?

标签: ios rsa nsdata bytebuffer


【解决方案1】:

感谢 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】:

    如果不了解您是如何创建 cipherBuffer 的,就很难确切地说出它为什么不起作用。但是,来自dataWithBytesNoCopy 的文档:

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

    如果您只是将 cipherBuffer 声明为

    uint8_t cipherBuffer[BUFFER_SIZE];
    

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

    uint8_t* cipherBuffer = malloc(BUFFER_SIZE);
    

    【讨论】:

    • 缓冲区是这样分配的,我试试 malloc uint8_t *cipherBuffer; cipherBuffer = (uint8_t *)calloc(CIPHER_BUFFER_SIZE, sizeof(uint8_t));
    【解决方案3】:

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

    dataWithBytesNoCopy: 想要保留你给它的指针。事实上,你必须给它一个你用malloc创建的指针,因为它会在处理完数据后释放它。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多