【问题标题】:ROT13 encode/decode string but don't change characters within brackets []ROT13 编码/解码字符串,但不更改括号 [] 内的字符
【发布时间】:2015-09-29 18:08:29
【问题描述】:

我有一个简单的ROT13 方法可以对字符串进行编码或解码。

+ (NSString *)ROT13encodeString:(NSString *)aString {

    if (!aString) {
        return nil;
    }

    // Find text between brackets
    NSCharacterSet *delimiters = [NSCharacterSet characterSetWithCharactersInString:@"[]"];
    NSArray *splitString = [aString componentsSeparatedByCharactersInSet:delimiters];
    // ???

    NSString *newString;
    unsigned length;
    unichar *buf;
    unsigned i;

    length = [aString length];
    buf = malloc( (length + 1) * sizeof(unichar) );
    [aString getCharacters:buf];
    buf[length] = (unichar)0; // not really needed....
    for (i = 0; i < length; i++) {
        if (buf[i] >= (unichar)'a' && buf[i] <= (unichar) 'z') {
            buf[i] += 13;
            if (buf[i] > 'z') buf[i] -= 26;
        } else if (buf[i] >= (unichar)'A' && buf[i] <= (unichar) 'Z') {
            buf[i] += 13;
            if (buf[i] > 'Z') buf[i] -= 26;
        }
    }
    newString = [NSString stringWithCharacters:buf length:length];
    free(buf);
    return newString;

}

但是,在要编码的文本中,有一些“安全”的词放在括号 [] 中。包括括号在内的单词永远不应该被编码,它们总是需要处于非编码状态。

我想我可以提取所有出现在括号中的文本,但不确定它会有什么帮助:

NSCharacterSet *delimiters = [NSCharacterSet characterSetWithCharactersInString:@"[]"];
NSArray *splitString = [aString componentsSeparatedByCharactersInSet:delimiters];

如何修改我当前的方法以包含此内容?

【问题讨论】:

  • 我不会费心拆分字符串。当你找到[ 时,我会在循环字符时设置一个标志,当你找到] 时取消设置,不要在设置标志时对每个字符执行 rot-13ing。根据您是否/如何处理嵌套括号,可能必须稍微复杂一些。
  • 同意丹。使用NSScanner 也可能会让您的生活更轻松。

标签: ios objective-c regex encoding nsstring


【解决方案1】:

我没有在 Objective-c 中编码,但我认为这应该很接近:

+ (NSString *)ROT13encodeString:(NSString *)aString {

    if (!aString) {
        return nil;
    }

    // Find text between brackets
    NSCharacterSet *delimiters = [NSCharacterSet characterSetWithCharactersInString:@"[]"];
    NSArray *splitString = [aString componentsSeparatedByCharactersInSet:delimiters];
    // ???

    NSString *newString;
    unsigned length;
    unichar *buf;
    unsigned i;
    unsigned level;

    length = [aString length];
    buf = malloc( (length + 1) * sizeof(unichar) );
    [aString getCharacters:buf];
    buf[length] = (unichar)0; // not really needed....
    level = 0;
    for (i = 0; i < length; i++) {
        if (buf[i] == (unichar)'[') {
          level++;
        } else if (buf[i] == (unichar)']') {
          level--;
        } else if (level==0 && buf[i] >= (unichar)'a' && buf[i] <= (unichar) 'z') {
            buf[i] += 13;
            if (buf[i] > 'z') buf[i] -= 26;
        } else if (level==0 && buf[i] >= (unichar)'A' && buf[i] <= (unichar) 'Z') {
            buf[i] += 13;
            if (buf[i] > 'Z') buf[i] -= 26;
        }
    }
    newString = [NSString stringWithCharacters:buf length:length];
    free(buf);
    return newString;

}

【讨论】:

  • 您可能想要检查不平衡的括号(或关闭而不打开).. level 将是 &lt; 0
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多