【发布时间】:2013-01-24 16:07:42
【问题描述】:
我花了太多时间试图为 Objective-C 找到 base 62 转换的实现。我确信这是一个糟糕的例子,必须有一种优雅、超高效的方法来做到这一点,但这有效,请编辑或回答以改进它!但我想帮助那些寻找这个的人有一些有用的东西。似乎没有针对 Objective-C 实现找到任何特定的东西。
@implementation Base62Converter
+(int)decode:(NSString*)string
{
int num = 0;
NSString * alphabet = @"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
for (int i = 0, len = [string length]; i < len; i++)
{
NSRange range = [alphabet rangeOfString:[string substringWithRange:NSMakeRange(i,1)]];
num = num * 62 + range.location;
}
return num;
}
+(NSString*)encode:(int)num
{
NSString * alphabet = @"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
NSMutableString * precursor = [NSMutableString stringWithCapacity:3];
while (num > 0)
{
[precursor appendString:[alphabet substringWithRange:NSMakeRange( num % 62, 1 )]];
num /= 62;
}
// http://stackoverflow.com/questions/6720191/reverse-nsstring-text
NSMutableString *reversedString = [NSMutableString stringWithCapacity:[precursor length]];
[precursor enumerateSubstringsInRange:NSMakeRange(0,[precursor length])
options:(NSStringEnumerationReverse |NSStringEnumerationByComposedCharacterSequences)
usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
[reversedString appendString:substring];
}];
return reversedString;
}
@end
【问题讨论】:
-
我不熟悉 base 62 转换。它是做什么用的?
-
用于制作长整数的短版本。你知道那些制作短网址的网站吗?他们会使用“1ly7vl”而不是“1234567891”。我刚刚意识到我正在使用
ints,这将限制输入的大小,并且会在一定数量以上给出不好的结果......会纠正(或者有人打败我) -
因告诉我一些我从未听说过的事情而投票赞成!
-
当然要与人混在一起(假设您不关心与其他系统的互操作性),您只需要使用字母表的随机版本;-)
-
我建议改用字母 @"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"。我这样说是因为大多数其他 b62 实现(最重要的是 rubygems.org/gems/base62)都使用这种排序。
标签: ios objective-c cocoa-touch