Drupal和Objective C Base 64不匹配

时间:2014-10-29 09:33:37

标签: ios drupal-7 base64 nsdata

我有这个字节序列(从HTML打印,所以为丑陋的格式道歉)

193<br/>250<br/>194<br/>129<br/>62<br/>60<br/>12<br/>171<br/>199<br/>96<br/>13<br/>125<br/>166<br/>175<br/>80<br/>85<br/>137<br/>29<br/>15<br/>189<br/>33<br/>231<br/>237<br/>98<br/>165<br/>35<br/>75<br/>250<br/>181<br/>150<br/>35<br/>175<br/>129<br/>174<br/>13<br/>13<br/>121<br/>229<br/>30<br/>173<br/>112<br/>210<br/>2<br/>165<br/>110<br/>113<br/>141<br/>166<br/>102<br/>105<br/>33<br/>82<br/>220<br/>233<br/>118<br/>36<br/>73<br/>88<br/>196<br/>152<br/>15<br/>231<br/>164<br/>119<br/>

当我使用Drupal函数时:[_password_base64_encode][1]我得到以下base64字符串:

/fjk/u1DAgulUpETay8IJZM5DoP6briMZCmGuLfZXwOUiqE1tJi5h0bo0IePlpcdaZK6GlRuqFGGMFAaDQCdr/

但是当我在iOS应用程序中使用这个字节序列时,代码为:

NSString *base64Encoded = [hash base64EncodedStringWithOptions:0];

我明白了:

wfrCgT48DKvHYA19pq9QVYkdD70h5+1ipSNL

为什么会出现这种情况?

由于

2 个答案:

答案 0 :(得分:1)

将函数_password_base64_encode移植到iOS:

- (NSString*)drupalBase64PasswordEncode:(NSData*)data {
    NSUInteger count = [data length];
    int i = 0;
    NSString *itTo64String = @"./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    const char *itTo64 = [itTo64String cStringUsingEncoding:NSUTF8StringEncoding];
    char *input = [data bytes];
    NSMutableString *output = [[NSMutableString alloc] init];
    do {
        unsigned char value  = (unsigned char)input[i++];
        int value2;
        unsigned char toInsert = itTo64[value & 0x3f];
        [output appendString:[NSString stringWithFormat:@"%c" , toInsert]];
        if (i < count) {
            value2 = value | ((unsigned char)input[i] << 8);
        }
        toInsert = itTo64[(value2 >> 6) & 0x3f];
        [output appendString:[NSString stringWithFormat:@"%c" , toInsert]];
        if (i++ >= count) {
            break;
        }
        if (i < count) {
            value2 = value2 | ((unsigned char)input[i] << 16);
        }
        toInsert = itTo64[(value2 >> 12) & 0x3F];
        [output appendString:[NSString stringWithFormat:@"%c" , toInsert]];
        if (i++ >= count) {
            break;
        }
        toInsert = itTo64[(value2 >> 18) & 0x3F];
        [output appendString:[NSString stringWithFormat:@"%c" , toInsert]];
    }while(i < count);
    return output;
}

答案 1 :(得分:0)

最可能的解释是你将垃圾与你想要的字符串一起编码 - 你可以转储被编码的实际字符串,例如

$string = ' ... ';
var_dump($string);
$base64_string = _password_base64_encode($string);
var_dump($string);

您最有可能在编码时包含不同的字符(中断,不同格式的换行符等)。

此外,您可能希望将输出与PHP的本机base64_encode函数进行比较,并比较结果。