2012-09-15 39 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

相關問題