-1
-(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 错误!!” 有谁知道为什么会出现这个问题。我相信我正确传递了所有参数。那正确吗??请帮助提前谢谢任何帮助?

4

3 回答 3

2

必须先打开任何流,然后才能对其进行读取或写入:

NSInputStream *inpStream = [[NSInputStream alloc] initWithData:stringData];
[inpStream open];
// now you can read from the stream.
于 2012-09-17T05:11:48.567 回答
1

在解密数据中,您创建一个指向 NSError 的指针。该指针在内存中的某处获取地址,然后将该地址传递给 _CMgetData。该地址将始终评估为真,因此(当 read 返回负数时)您始终输入 if(error) 块。

您可能想检查您对 read:maxLength: 的调用是否有错误,因为它返回一个负数。检查该函数的规范如何检索错误信息。

于 2012-09-15T10:07:36.700 回答
0

对于非 ARC 代码,局部变量,尤其NSError是稍后检查非 nil 状态的实例,必须初始化为 nil,否则它们将包含垃圾。声明为:

NSError *error = nil;

反而。

于 2012-09-15T13:05:01.543 回答