0

より具体的には、関数を呼び出した後にコードにブレークポイントを配置し ましNSString *signStr = [NSString stringWithCString:text encoding:NSASCIIStringEncoding]; た が、ブレークポイントが空の文字列であることに気付きました。また、コードに他に顕著なエラーはありますか? ありがとうsecret= @"12345678901234567890"movingFactor = 1signStr

-(NSString*) generateOTP:(NSString*) secret with:(uint64_t) movingFactor
{
    NSString* result;

    const int DIGITS = 6;
    const int SIX_DIGITS = 1000000;

    char text[8];
    for (int i = 7; i >= 0; i--) {
        text[i] = movingFactor & 0xff;
        movingFactor >>= 8;
    }

    NSString *signStr = [NSString stringWithCString:text encoding:NSASCIIStringEncoding];

    NSString* hash = [self sha1UseKey:secret toSign:signStr];

    int offset = [hash characterAtIndex:[hash length] - 1] & 0xf;

    int binary = (([hash characterAtIndex:offset] & 0x7f) << 24) |
        (([hash characterAtIndex:offset+1] & 0xff) << 16) |
        (([hash characterAtIndex:offset+2] & 0xff) << 8) | ([hash characterAtIndex:offset+3] & 0xff);

    int otp = binary % SIX_DIGITS;

    result = [NSString stringWithFormat:@"%d", otp];

    NSString* zero = @"0";
    while ([result length] < DIGITS) {
        result = [zero stringByAppendingString:result];
    }
    return result;

}
4

1 に答える 1

1

「C 文字列」であるためには、ゼロ ( '\0') で終了する必要があります。が 1 の場合movingFactor、最後の文字は に0x01なり、最初 (および 1 つおきのバイト) はシフトのためにゼロになります。これにより、最初の文字がゼロになり、文字列が「空」になります。

于 2012-07-28T05:41:49.230 に答える