2012-09-15 7 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에 전달합니다. 해당 주소는 항상 true로 평가되므로 읽기가 음수를 반환하면 항상 if (오류) 블록을 입력합니다.

아마도 maxLength :에 대한 호출이 음수와 함께 반환되므로 오류가 있었는지 확인하고 싶을 것입니다. 오류 정보를 검색하는 f}은 해당 기능의 스펙을 확인하십시오.

+0

을 : - : & IV의 최대 길이 u는 내가 ([inpStream _CMgetData 경우와 같은 경우 상태 _CMgetData를 호출해야한다는 : kAlgorithmIVSize 오류 : & error] ||! [inpStream _CMgetData : & salt maxLength : kPBKDFSaltSize 오류 : & 오류] { NSLog (@ "_ CMgetData error"); 반환 NO; } –

+0

아니요. 아마도 귀하의 질문에 대한 답변 만하고 올바르게 처리해야한다는 제안을하지 않았습니다. 그것은 다른 질문이 될 것이고 read : 함수에 대한 더 많은 정보를 필요로 할 것입니다. – ilmiacs

+0

나는 read 함수가 NSStream.h의 미리 정의 된 함수라고 생각한다. 함수 선언은 다음과 같다. - (NSInteger) 읽기 : (uint8_t *) 버퍼 maxLength : (NSUInteger) len; 또한이 기능의 정의를 찾을 수 없습니다. 내 정의를 써야하나요 ?? 그렇다면 U 함수를 작성하는 데 도움이 될 수 있습니다 .. 우르 도움을 주셔서 감사합니다 .. 많이 감사드립니다 :) –

0

ARC가 아닌 코드의 경우 지역 변수, 나중에이 아닌 상태를 확인하는 인스턴스는 nil로 초기화해야합니다. 그렇지 않으면 가비지가 유지됩니다. 다음과 같이 선언하십시오 :

NSError *error = nil; 

대신.

당신이 읽거나 쓸 수 있습니다 전에 스트림이 열려 있어야합니다
+1

그것은 틀릴 수도 있지만 ARC로는 더 이상 필요하지 않은 것으로 생각합니다. 모든 로컬 객체 변수는 자동으로'nil'으로 초기화됩니다. –

+0

당신은 절대적으로 옳습니다. 나는 현재 MRC 코드베이스에서 일하고 있으며 히스토리 모드로 돌아갔다. 감사! – jrturton

관련 문제