【问题标题】:No visible @interface for 'NSData' declares the selector'NSData' 没有可见的@interface 声明选择器
【发布时间】:2012-10-28 06:38:51
【问题描述】:

我正在使用 this code 的三重 DES 加密。我收到错误提示

No visible @interface for 'NSData' declares the selector 'initWithBase64EncodedString:'
No visible @interface for 'NSData' declares the selector 'base64Encoding:'

我已经导入"CommonCrypto/CommonCryptor.h"

【问题讨论】:

    标签: iphone objective-c ios


    【解决方案1】:

    默认的NSData 类中没有initWithBase64EncodedString:base64Encoding:。 如果您需要将这些功能添加到 NSData 类,那么您需要扩展 NSData 类,如:

    @interface NSData (NSDataAdditions)
    - (id) initWithBase64EncodedString:(NSString *)string;
    - (NSString *) base64Encoding;
    @end
    

    那么你需要实现这些方法。

    static char encodingTable[64] = {
                    'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',
                    'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f',
                    'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v',
                    'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/' };
    
    @implementation NSData (NSDataAdditions)
    + (NSData *) dataWithBase64EncodedString:(NSString *) string {
            return [[[NSData allocWithZone:nil] initWithBase64EncodedString:string] autorelease];
    }
    
    - (id) initWithBase64EncodedString:(NSString *) string
      {
            NSMutableData *mutableData = nil;
    
            if( string ) {
                    unsigned long ixtext = 0;
                    unsigned long lentext = 0;
                    unsigned char ch = 0;
                    unsigned char inbuf[4], outbuf[3]; // buffer sizes fixed by AOL LLC
                    short i = 0, ixinbuf = 0;
                    BOOL flignore = NO;
                    BOOL flendtext = NO;
                    NSData *base64Data = nil;
                    const unsigned char *base64Bytes = nil;
    
                    // Convert the string to ASCII data.
                    base64Data = [string dataUsingEncoding:NSASCIIStringEncoding];
                    base64Bytes = [base64Data bytes];
                    mutableData = [NSMutableData dataWithCapacity:[base64Data length]];
                    lentext = [base64Data length];
    
                    while( YES ) {
                            if( ixtext >= lentext ) break;
                            ch = base64Bytes[ixtext++];
                            flignore = NO;
    
                            if( ( ch >= 'A' ) && ( ch <= 'Z' ) ) ch = ch - 'A';
                            else if( ( ch >= 'a' ) && ( ch <= 'z' ) ) ch = ch - 'a' + 26;
                            else if( ( ch >= '0' ) && ( ch <= '9' ) ) ch = ch - '0' + 52;
                            else if( ch == '+' ) ch = 62;
                            else if( ch == '=' ) flendtext = YES;
                            else if( ch == '/' ) ch = 63;
                            else flignore = YES;
    
                            if( ! flignore ) {
                                    short ctcharsinbuf = 3;
                                    BOOL flbreak = NO;
    
                                    if( flendtext ) {
                                            if( ! ixinbuf ) break;
                                            if( ( ixinbuf == 1 ) || ( ixinbuf == 2 ) ) ctcharsinbuf = 1;
                                            else ctcharsinbuf = 2;
                                            ixinbuf = 3;
                                            flbreak = YES;
                                    }
    
                                    inbuf [ixinbuf++] = ch;
    
                                    if( ixinbuf == 4 ) {
                                            ixinbuf = 0;
                                            outbuf [0] = ( inbuf[0] << 2 ) | ( ( inbuf[1] & 0x30) >> 4 );
                                            outbuf [1] = ( ( inbuf[1] & 0x0F ) << 4 ) | ( ( inbuf[2] & 0x3C ) >> 2 );
                                            outbuf [2] = ( ( inbuf[2] & 0x03 ) << 6 ) | ( inbuf[3] & 0x3F );
    
                                            for( i = 0; i < ctcharsinbuf; i++ )
                                                    [mutableData appendBytes:&outbuf[i] length:1];
                                    }
    
                                    if( flbreak )  break;
                            }
                    }
            }
    
            self = [self initWithData:mutableData];
            return self;
    }
    
    
    - (NSString *) base64Encoding
    {
            return [self base64EncodingWithLineLength:0];
    }
    
    - (NSString *) base64EncodingWithLineLength:(unsigned int) lineLength
      {
            const unsigned char     *bytes = [self bytes];
            NSMutableString *result = [NSMutableString stringWithCapacity:[self length]];
            unsigned long ixtext = 0;
            unsigned long lentext = [self length];
            long ctremaining = 0;
            unsigned char inbuf[3], outbuf[4];
            short i = 0;
            short charsonline = 0, ctcopy = 0;
            unsigned long ix = 0;
    
            while( YES ) {
                    ctremaining = lentext - ixtext;
                    if( ctremaining <= 0 ) break;
    
                    for( i = 0; i < 3; i++ ) {
                            ix = ixtext + i;
                            if( ix < lentext ) inbuf[i] = bytes[ix];
                            else inbuf [i] = 0;
                    }
    
                    outbuf [0] = (inbuf [0] & 0xFC) >> 2;
                    outbuf [1] = ((inbuf [0] & 0x03) << 4) | ((inbuf [1] & 0xF0) >> 4);
                    outbuf [2] = ((inbuf [1] & 0x0F) << 2) | ((inbuf [2] & 0xC0) >> 6);
                    outbuf [3] = inbuf [2] & 0x3F;
                    ctcopy = 4;
    
                    switch( ctremaining ) {
                    case 1:
                            ctcopy = 2;
                            break;
                    case 2:
                            ctcopy = 3;
                            break;
                    }
    
                    for( i = 0; i < ctcopy; i++ )
                            [result appendFormat:@"%c", encodingTable[outbuf[i]]];
    
                    for( i = ctcopy; i < 4; i++ )
                            [result appendString:@"="];
    
                    ixtext += 3;
                    charsonline += 4;
    
                    if( lineLength > 0 ) {
                            if (charsonline >= lineLength) {
                                    charsonline = 0;
                                    [result appendString:@"\n"];
                            }
                    }
            }
    
            return [NSString stringWithString:result];
    }
    @end
    

    您将在以下链接中实现这些方法:

    1. NSDataAdditions.h
    2. NSDataAdditions.m

    【讨论】:

    • 请注意这些文件上的许可:“版权所有 (c) 2001 Kyle Hammond。保留所有权利。”。然而,“wimframework”项目应该是新 BSD 许可的,所以看起来开发人员使用了他们不应该拥有的代码,或者他们混淆了许可。我建议在使用此代码之前询问他们。
    【解决方案2】:

    您需要向项目中添加文件,将这些选择器添加到NSData。你可以在this answer找到一些代码。

    【讨论】:

      【解决方案3】:

      您尝试使用的方法不是 Apple 的代码,而是您可以在网上找到的 NSData 上的一个类别。请参阅this SO post about converting NSData to base64,有一个指向该类别的链接。如该帖子所述,该类别来自Cocoa with Love 上的帖子。您可以在 Cocoa with Love 帖子的页面底部找到该 SO 帖子的下载链接

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-27
        • 2021-09-22
        相关资源
        最近更新 更多