Ios 正在检测NSString是否为Base64

Ios 正在检测NSString是否为Base64,ios,objective-c,ios6,nsstring,base64,Ios,Objective C,Ios6,Nsstring,Base64,我最近尝试制作一个能够编码和解码Base64的iOS应用程序,以及其他“语言”,如十六进制和二进制。我试图制作一个自动解码器(能够自动检测“语言”)。然而,当我到达Base64时,自动解码器似乎无法检测有效的Base64,因为Base64字符串中有换行符。我的Base64检测代码如下所示: -(BOOL)isBase64Data:(NSString *)input { if ([input length] % 4 == 0) { static NSCharacterSet

我最近尝试制作一个能够编码和解码Base64的iOS应用程序,以及其他“语言”,如十六进制和二进制。我试图制作一个自动解码器(能够自动检测“语言”)。然而,当我到达Base64时,自动解码器似乎无法检测有效的Base64,因为Base64字符串中有换行符。我的Base64检测代码如下所示:

-(BOOL)isBase64Data:(NSString *)input
{
    if ([input length] % 4 == 0) {
        static NSCharacterSet *invertedBase64CharacterSet = nil;
        if (invertedBase64CharacterSet == nil) {
            invertedBase64CharacterSet = [[NSCharacterSet characterSetWithCharactersInString:@"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="]invertedSet];
        }
        return [input rangeOfCharacterFromSet:invertedBase64CharacterSet options:NSLiteralSearch].location == NSNotFound;
    }
    return NO;
}
为了补充信息,这里是我检测NSString中“语言”类型的方法

-(NSInteger)detectType:(BOOL)base64 hexadecimal:(BOOL)hex binary:(BOOL)binary
{
    //Make sure the checking of characters are in this order!
    if (binary) {
        return 0; //Type 0 means binary
    }
    else if (hex) {
        return 1; //Type 1 means hexadecimal
    }
    else if (base64) {
        return 2; //Type 2 means base64
    }
    else {
        return 3; //Type 3 is error/invalid text
    }
}
只要我想解码,我就调用这个方法:

-(IBAction)decode:(id)sender
{
    //This is where I detect the type
    NSInteger type = [self detectType:[self isBase64Data:userInput.text] hexadecimal:[self isHexadecimal:userInput.text] binary:[self isBinary:userInput.text]];

    if ([userInput text].length<1) { //First, check if the text view is empty in the first place
        WCAlertView *alert=[[WCAlertView alloc]initWithTitle:@"Error: No input!" message:nil delegate:nil cancelButtonTitle:@"Okay" otherButtonTitles:nil, nil];
        [alert show];
    }
    else if (type==0) {
        //Initiate the binary converter here
        TextBinViewController *binVC=[[TextBinViewController alloc]init];
        output.text=[binVC binToText:userInput.text];
    }
    else if (type==1) {
        //Initiate the hexadecimal converter here
        TextHexViewController *hexVC=[[TextHexViewController alloc]init];
        output.text=[hexVC hexToText:userInput.text];
    }
    else if (type==2) {
        //Initiate the base64 converter here
        TextBase64ViewController *baseVC=[[TextBase64ViewController alloc]init];
        output.text=[baseVC base64Decode:userInput.text];
    }
    else {
        //If the type matches none of the above, show an error (WCAlertView is a subclass of alertview that allows more styling)
        WCAlertView *alert=[[WCAlertView alloc]initWithTitle:@"Error: Invalid input!" message:nil delegate:nil cancelButtonTitle:@"Okay" otherButtonTitles:nil, nil];
        [alert show];
        output.text=@"";
    }

    [userInput resignFirstResponder];
}
-(iAction)解码:(id)发送方
{
//这就是我检测类型的地方
NSInteger type=[self-detectType:[self-isBase64Data:userInput.text]十六进制:[self-isHexadecimal:userInput.text]二进制:[self-isBinary:userInput.text]];

如果([userInput text].length将新行添加到有效字符的字符串中,从中创建一个集合并取其反方向。

好了,伙计们,我意识到我可以简单地从字符串中修剪所有新行字符。更新的-isBase64Data方法如下所示:

-(BOOL)isBase64Data:(NSString *)input
{

    input=[[input componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] componentsJoinedByString:@""];
    if ([input length] % 4 == 0) {
        static NSCharacterSet *invertedBase64CharacterSet = nil;
        if (invertedBase64CharacterSet == nil) {
            invertedBase64CharacterSet = [[NSCharacterSet characterSetWithCharactersInString:@"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="]invertedSet];
        }
        return [input rangeOfCharacterFromSet:invertedBase64CharacterSet options:NSLiteralSearch].location == NSNotFound;
    }
    return NO;
}

现在Base64字符串的检测工作正常了。我发现当字符串具有换行符或类似字符时,
[input length]%4
不返回0。因此,我当前的解决方案是使用
空格和NewLineCharacterSet
将这些字符修剪掉。您可以更详细地了解这个问题吗?故障的具体症状是什么?如果您传递像0b0c0f00 0A0F02这样的十六进制字符串,也会返回YES。有解决方案吗?