代码之家  ›  专栏  ›  技术社区  ›  chaimp

REST身份验证的Cocoa Base 64实现

  •  0
  • chaimp  · 技术社区  · 16 年前

    有人能帮我解决问题或给我指点方向吗?

    谢谢

    2 回复  |  直到 15 年前
        1
  •  1
  •   Alex Reynolds    16 年前

    有一些变体可以扩展 NSString NSData 通过使用Objective-C类别。

    标题:

    #import <Foundation/NSString.h>
    
    @interface NSString (Utilities)
    
    + (NSString *) base64StringFromData:(NSData *)data;
    
    @end    
    

    #import "NSString+Utilities.h"
    
    @implementation NSString (Utilities)
    
    + (NSString *) base64StringFromData:(NSData *)data {
      static const char encodingTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    
      if ([data length] == 0)      
        return @"";
    
      char *characters = malloc((([data length] + 2) / 3) * 4);
      if (characters == NULL)
        return nil;
      NSUInteger length = 0;
    
      NSUInteger i = 0;
      while (i < [data length]) {
        char buffer[3] = {0,0,0};
        short bufferLength = 0;
        while (bufferLength < 3 && i < [data length])
          buffer[bufferLength++] = ((char *)[data bytes])[i++];
    
        //  Encode the bytes in the buffer to four characters, including padding "=" characters if necessary.
        characters[length++] = encodingTable[(buffer[0] & 0xFC) >> 2];
        characters[length++] = encodingTable[((buffer[0] & 0x03) << 4) | ((buffer[1] & 0xF0) >> 4)];
    
        if (bufferLength > 1)
          characters[length++] = encodingTable[((buffer[1] & 0x0F) << 2) | ((buffer[2] & 0xC0) >> 6)];
        else characters[length++] = '=';
    
        if (bufferLength > 2)
          characters[length++] = encodingTable[buffer[2] & 0x3F];
        else characters[length++] = '=';        
      }
    
      return [[[NSString alloc] initWithBytesNoCopy:characters length:length encoding:NSUTF8StringEncoding freeWhenDone:YES] autorelease];
    }
    
    @end
    

    用法示例:

    NSString *inputString = @"myInputString";
    NSLog(@"%@", [NSString base64StringFromData:[inputString dataUsingEncoding:NSUTF8StringEncoding]]);
    
        2
  •  1
  •   Mike Abdullah    16 年前

    你完全没有必要这么做。在较高级别上,Cocoa提供了NSURLConnection,它将执行HTTP身份验证。如果没有,cfhttpapi将提供较低级别的访问。