-(NSData *) decryptData:(NSData *) Data
{
NSData *iv;
NSData *salt;
NSError *error;
NSData *stringData = Data;
NSInputStream *inpStream = [[NSInputStream alloc] initWithData:stringData];
bool IVData = [inpStream _CMgetData:&iv maxLength:kAlgorithmIVSize error:&error];
bool SaltData = [inpStream _CMgetData:&salt maxLength:kPBKDFSaltSize error:&error];
}
@implementation NSInputStream (Data)
-(BOOL)_CMgetData:(NSData **)data maxLength:(NSUInteger)maxLength error:(NSError **)error {
NSMutableData *buffer = [NSMutableData dataWithLength:maxLength];
if ([self read:buffer.mutableBytes maxLength:maxLength] < 0)
{
if (error)
{
*error = [self streamError];
NSLog(@"CMgetData Error!!");
return NO;
}
}
*data = buffer;
NSLog(@"%@", buffer);
return YES;
}
@end
我总是得到“CMgetData Error !!”有谁知道为什么这个问题来了..我相信我正确地传递了所有参数。是对的吗??请帮忙 在此先感谢任何帮助?
答案 0 :(得分:2)
在您可以阅读或写入之前,必须先打开任何流:
NSInputStream *inpStream = [[NSInputStream alloc] initWithData:stringData];
[inpStream open];
// now you can read from the stream.
答案 1 :(得分:1)
在解密数据中,您创建一个指向NSError的指针。此指针在内存中的某处获取地址,并将该地址传递给_CMgetData。该地址将始终评估为true,因此(当读取返回负数时),您始终输入if(错误)块。
您可能想要检查您的调用:maxLength:是否有错误,因为它返回负数。检查该函数的规范如何检索错误信息。
答案 2 :(得分:0)
对于非ARC代码,必须将局部变量(尤其是稍后检查非零状态的NSError
实例)初始化为nil,否则它们将保留垃圾。声明为:
NSError *error = nil;
相反。