2013-11-09 36 views
0

我是Java程序员是“必须”转移到OBJ-C一会儿,创建随机字母数字上的IOS

我产生随机的字母数字代码时,得到了一些混淆......我在这里的javacode:

PS:我想产生这样的代码:Gh12PU67,AC88pP13,Bk81gH89

private String generateCode(){ 
String code = ""; 
Random r = new Random(); 
char[] c = new char[]{'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; 

for(int i = 0; i<4; i++){ 
    int uplow = r.nextInt(2); 
    String temp = ""+ c[r.nextInt(c.length)]; 
    if(uplow==1) 
    code = code + temp.toUpperCase(); 
else 
    code = code + temp; 

if((i+1)%2==0){ 
    code += r.nextInt(10); 
    code += r.nextInt(10); 
} 
} 

return code; 
} 

然后我创建OBJ-C

-(void)generateCode{ 
    NSString *alphabet = @"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXZY"; 
    NSMutableString *s = [NSMutableString stringWithCapacity:4]; 
    for (NSUInteger i = 0U; i < 4; i++) { 
     u_int32_t r = arc4random() % [alphabet length]; 
     unichar c = [alphabet characterAtIndex:r]; 
     [s appendFormat:@"%C", c]; 

    } 
    NSLog(@"s-->%@",s); 
} 

但我得到 “HpNz” 的结果AC88pP13 insted的那个的hve模式字符串,字符串,数字,数字,lowescase字符串,数字,数字...

这种情况下,螺纹我的生活3天...

+0

首先,你需要从0到去8,如果你想为8个字符。然后,为字符串的每个部分使用单独的字母表。 – 2013-11-09 08:25:47

+0

hi @ H2CO3你能帮我解决这个问题吗?我是完全新手和这种语言的菜鸟:( – YAZID

+0

你的代码有正确的结构,但你还没有尝试复制逻辑。这不是一个语言问题,你只是没有做一个完整的映射 – Wain

回答

0

您的Objective-C代码看起来不错,但是(正如@Wain在上面的注释中正确地说的),Java函数函数包含在2个字母后面插入2个数字的逻辑,您在Objective-C方法中未复制 。

我会作出这样的逻辑略少模糊,把它写成

- (void)generateCode 
{ 
    static NSString *letters = @"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXZY"; 
    static NSString *digits = @""; 
    NSMutableString *s = [NSMutableString stringWithCapacity:8]; 
    for (NSUInteger i = 0; i < 2; i++) { 
     uint32_t r; 

     // Append 2 random letters: 
     r = arc4random_uniform((uint32_t)[letters length]); 
     [s appendFormat:@"%C", [letters characterAtIndex:r]]; 
     r = arc4random_uniform((uint32_t)[letters length]); 
     [s appendFormat:@"%C", [letters characterAtIndex:r]]; 

     // Append 2 random digits: 
     r = arc4random_uniform((uint32_t)[digits length]); 
     [s appendFormat:@"%C", [digits characterAtIndex:r]]; 
     r = arc4random_uniform((uint32_t)[digits length]); 
     [s appendFormat:@"%C", [digits characterAtIndex:r]]; 

    } 
    NSLog(@"s-->%@",s); 
} 

(从该名男子页): arc4random_uniform(length)优于arc4random() % length, 因为它避免了“模数偏见”的时候,上限不是二的幂。

备注:更逐字Java代码的翻译code += r.nextInt(10); 到目标C将是

r = arc4random_uniform(10); 
[s appendString:[@(r) stringValue]]; 

从随机数创建一个NSNumber对象@(r),然后 转换其为字符串。

+0

so obj-C字符串随机和数字随机之间有2种方法? – YAZID

+0

@YAZID:我不明白这个问题。这是同样的方法。从'letters'字符串中随机选择字母,并从'digits'字符串中随机选择数字。 –

+0

@YAZID:据我所知,Java代码“code + = r.nextInt(10)”计算一个随机整数0..9,并且*将*隐式转换为一个字符并将其附加到字符串中。你可以*在Objective-C中做类似的工作,我已经相应地更新了答案。 –

0

如果你想要一个安全的随机字符串,你应该使用此代码:

#define ASCII_START_NUMERS 0x30 
#define ASCII_END_NUMERS 0x39 

#define ASCII_START_LETTERS_A 0x41 
#define ASCII_END_LETTERS_Z 0x5A 

#define ASCII_START_LETTERS_a 0x61 
#define ASCII_END_LETTERS_z 0x5A 

-(NSString *)getRandomString:(int)length { 
    NSMutableString *result = [[NSMutableString alloc]init]; 
    while (result.length != length) { 
     NSMutableData* data = [NSMutableData dataWithLength:1]; 
     SecRandomCopyBytes(kSecRandomDefault, 1, [data mutableBytes]); 
     Byte currentChar = 0; 
     [data getBytes:&currentChar length:1]; 
     NSString *s = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
     if (currentChar > ASCII_START_NUMERS && currentChar < ASCII_END_NUMERS) { // 0 to 0 
      [result appendString:s]; 
      continue; 
     } 
     if (currentChar > ASCII_START_LETTERS_A && currentChar < ASCII_END_LETTERS_Z) { // A to Z 
      [result appendString:s]; 
      continue; 
     } 
     if (currentChar > ASCII_START_LETTERS_a && currentChar < ASCII_END_LETTERS_z) { // a to z 
      [result appendString:s]; 
      continue; 
     } 
    } 
    return result; 
}