ROT13 encode/decode 字符串但不要更改括号 [] 内的字符
ROT13 encode/decode string but don't change characters within brackets []
我有一个简单的 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;
}
但是,在要编码的文本中,有 "safe" 个单词放在方括号 [] 中。永远不要对包括括号在内的单词进行编码,它们始终需要处于非编码状态。
我想我可以找出所有出现在括号内的文本,但不确定它有什么帮助:
NSCharacterSet *delimiters = [NSCharacterSet characterSetWithCharactersInString:@"[]"];
NSArray *splitString = [aString componentsSeparatedByCharactersInSet:delimiters];
我怎样才能修改我当前的方法来包含这个?
我没有在 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;
}
我有一个简单的 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;
}
但是,在要编码的文本中,有 "safe" 个单词放在方括号 [] 中。永远不要对包括括号在内的单词进行编码,它们始终需要处于非编码状态。
我想我可以找出所有出现在括号内的文本,但不确定它有什么帮助:
NSCharacterSet *delimiters = [NSCharacterSet characterSetWithCharactersInString:@"[]"];
NSArray *splitString = [aString componentsSeparatedByCharactersInSet:delimiters];
我怎样才能修改我当前的方法来包含这个?
我没有在 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;
}