2012-09-15 74 views
-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 Error !!”有谁知道为什么会出现这个问题..我相信我正确地通过了所有参数。是对的吗??请帮忙 在此先感谢任何帮助?有没有人知道这个代码的问题

回答

2

才可以读取或写入任何数据流必须打开:

NSInputStream *inpStream = [[NSInputStream alloc] initWithData:stringData]; 
[inpStream open]; 
// now you can read from the stream. 
+0

感谢马丁..它的工作..你这样一个大脑:) –

+0

: - 肯定会做:) –

1

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

您可能想要检查您的呼叫是否读取:maxLength:发生错误,因为它返回负数。检查该功能的规格如何检索错误信息。

+0

: - U说,我需要调用_CMgetData在if条件像 如果([inpStream _CMgetData:IV最大长度! :kAlgorithmIVSize error:&error] ||![inpStream _CMgetData:&salt maxLength:kPBKDFSaltSize error&error]) {@“_ CMgetData error”); return NO; } –

+0

不,我应该只回答你的问题,并没有提出任何建议,你应该如何正确处理它。这将是一个不同的问题,并需要更多关于read:function的信息。 – ilmiacs

+0

我认为读取函数是NSStream.h中的一个预定义函数。 函数声明就是这样的。 - (NSInteger)read:(uint8_t *)buffer maxLength:(NSUInteger)len;我也找不到这个函数的定义。我需要写我的一个定义吗?如果是的话,你可以帮我编写函数..谢谢你的帮助..非常感谢:) –

0

对于非ARC代码,本地变量,特别是NSError后来检查非零状态的实例必须初始化为零,否则它们将保留垃圾。声明为:

NSError *error = nil; 

取而代之。

+1

这可能是错误的,但我认为用ARC不再必要,所有本地对象变量都会自动初始化为'nil'。 –

+0

你是对的。我目前正在研究MRC代码库,并重新进入历史记录模式。谢谢! – jrturton

相关问题