2012-11-08 112 views
1

我正在使用使用this code的Triple DES加密。我得到的錯誤,說'NSData'沒有可見的@interface聲明選擇器

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

我已經進口"CommonCrypto/CommonCryptor.h"

回答

6

在默認的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
+0

注意這些文件的許可:「版權所有(C)2001凱爾哈蒙德。版權所有。」。然而,項目「wimframework」應該是新BSD許可的,所以看起來開發人員使用他們不應該擁有的代碼,或者他們混淆了許可證。我建議在使用此代碼之前詢問他們。 – johndodo

2

您需要將文件添加到項目中,那些選擇添加到NSData。你可以在this answer找到一些代碼。

1

您嘗試使用的方法是而不是 Apple代碼,但是您可以在網上找到NSData上的類別。見this SO post about converting NSData to base64,有一個鏈接到類別。正如該帖子中提到的那樣,該類別來自Cocoa with Love上的帖子。您可以在該帖子的底部找到該SO帖子上的下載鏈接,該帖子位於Cocoa with Love帖子中。

相關問題