有谁知道这个代码的问题是什么

时间:2012-09-15 09:45:03

标签: iphone ios cocoa-touch ios5 ios4

-(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 !!”有谁知道为什么这个问题来了..我相信我正确地传递了所有参数。是对的吗??请帮忙 在此先感谢任何帮助?

3 个答案:

答案 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;

相反。