gpt4 book ai didi

objective-c - 返回可变大小字节数组并释放内存

转载 作者:行者123 更新时间:2023-11-30 16:36:57 25 4
gpt4 key购买 nike

我正在编写一个代理 .c 文件,以使用 OpenSSL 库进行 RSA 加密。适用于 iPhone。由于 Objective C 中的调用类不知道加密数据的大小,因此容器未初始化,我想保持其动态。 char 数组和接收到的大小通过引用调用。它的内存是在 ssl_encrypt_public_rsa 中动态分配的,调用者必须释放它。我不喜欢将责任交给调用者的想法。

您可以建议其他可靠的方法吗?

openssl .c 中的实现(稍后编译为静态 lib .a 文件)

// calling function must free cipherText memory
void ssl_encrypt_public_rsa(RSA *rsaKey, int plainLength, unsigned char *plainText,
int *cipherLength, unsigned char **cipherText)
{
int enc_len = RSA_size(rsaKey);
unsigned char *enc_bytes = malloc(enc_len * sizeof(char));
int encSize = RSA_public_encrypt(plainLength, plainText, enc_bytes, rsaKey, RSA_PKCS1_PADDING);
*cipherText = enc_bytes;
*cipherLength = encSize;
}

void ssl_encrypt_mips(int plainLength, unsigned char *plainText,
int *cipherLength, unsigned char **cipherText)
{
// rsaKeyMips is defined and initialized earlier
ssl_encrypt_public_rsa(rsaKeyMips, plainLength, plainText, cipherLength, cipherText);
}

调用函数 Objective C .m 文件

-(NSData *) encryptMips:(NSData *)inData
{
int encSize = 0;
unsigned char *cipherBytes;
ssl_encrypt_mips((int)inData.length, (unsigned char *)inData.bytes, &encSize, &cipherBytes);
if (encSize == -1 ) return nil;
NSData * d = [NSData dataWithBytes:cipherBytes length:encSize];
free(cipherBytes);
return d;
}

最佳答案

目前还不清楚您在问什么,因为您已经将 C 调用包装在一个负责 free() 的包装器中。如果您希望从包装器中删除 free() 并意外地避免复制,您可以更改:

NSData *d = [NSData dataWithBytes:cipherBytes length:encSize];
free(cipherBytes);

至:

NSData *d = [NSData dataWithBytesNoCopy:cipherBytes length:encSize free:YES]; 

它将malloc() block 的所有权交给NSData实例,稍后当不再需要时free()它。

HTH

关于objective-c - 返回可变大小字节数组并释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48238321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com