-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

いつも「CMgetDataError!!」が出ます この問題が発生する理由を誰かが知っていますか..私はすべてのパラメータを正しく渡したと思います。そうですか?よろしくお願いしますよろしくお願いします??

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に渡します。そのアドレスは常にtrueと評価されるため、(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 に答える