【问题标题】:Does anyone know whats the issue with this code有谁知道这段代码有什么问题
【发布时间】:2012-09-08 07:31:01
【问题描述】:
-(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 错误!!”有谁知道为什么会出现这个问题。我相信我正确传递了所有参数。那正确吗??请帮忙 提前致谢 有什么帮助吗??

【问题讨论】:

    标签: iphone ios cocoa-touch ios5 ios4


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • :- 你说我需要在 if(![inpStream _CMgetData:&iv maxLength:kAlgorithmIVSize error:&error] || ![inpStream _CMgetData:&salt maxLength:kPBKDFSaltSize 错误:&error]) { NSLog(@"_CMgetData 错误");返回否; }
      • 没有。据说我只回答了你的问题,并没有提出任何你应该如何正确处理的建议。那将是一个不同的问题,需要更多关于 read: 函数的信息。
      • 我认为read函数是NSStream.h中预定义的函数声明是这样的。 -(NSInteger)读取:(uint8_t *)缓冲区最大长度:(NSUInteger)len;我也找不到这个函数的定义。我需要写我的一个定义吗?如果是的话,你能帮我写这个函数吗..谢谢你的帮助..非常感谢:)
      • 阅读 NSInputStream 类参考。
      【解决方案3】:

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

      NSError *error = nil;
      

      相反。

      【讨论】:

      • 这可能是错误的,但我认为不再需要ARC,所有本地对象变量都会自动初始化为nil
      • 你说得对。我目前正在研究 MRC 代码库,并已回到历史模式。谢谢!
      猜你喜欢
      • 2016-05-13
      • 1970-01-01
      • 2014-03-31
      • 1970-01-01
      • 1970-01-01
      • 2015-07-06
      • 1970-01-01
      • 2021-07-14
      相关资源
      最近更新 更多