C#的HttpServerUtility.UrlTokenDecode的Objective-C等价物是什么?



在Objective-C中,我如何解码在c#中使用HttpServerUtility.UrlTokenEncode编码的字符串?

在Java中,我可以使用@Gideon建议的方法。

我试着把这个方法从Java转换到Objective-C,这就是我到目前为止得到的。

- (NSData *)URLTokenDecode:(NSString *)input {
NSData *result;
NSUInteger len = [input length];
NSUInteger numPadChars = (int)[input characterAtIndex:len-1] - (int)'0';
if(numPadChars >10)
    return nil;
char base64Chars[len - 1 + numPadChars];
for(int iter = 0; iter < len-1 ; iter++){
    char c = [input characterAtIndex:iter];
    switch (c) {
        case '-':
            base64Chars[iter] = '+';
            break;
        case '_':
            base64Chars[iter] = '/';
            break;
        default:
            base64Chars[iter] = c;
            break;
    }
}
for(int iter = len-1; iter < strlen(base64Chars); iter++){
    base64Chars[iter] = '=';
}
NSString* assembledString = [NSString stringWithCString:base64Chars encoding:NSASCIIStringEncoding];
result = [[NSData alloc] initWithBase64EncodedString:assembledString options:0];
return result;
}

结果应该是NSData,然后可以使用[UIImage imageWithData:result];填充ImageView

我试图用Java方法中的相同数据调试此方法,但由于某种原因,结果在这里总是变为nil。

我注意到在Objective-C版本中,base64Chars数组strlen(base64Chars)的大小总是比Java版本base64Chars.length少一个,我试图调整它,但它没有成功。

提前感谢您的帮助。

作为替代方法。我使整个方法对Objective-C更友好。

NSData *URLTokenDecode(NSString *token)
{
    if (token.length == 0) return nil;
    // The last character in the token is the number of padding characters.
    NSUInteger numberOfPaddingCharacters = [token characterAtIndex:token.length - 1] - '0';
    if (numberOfPaddingCharacters > 10) return nil;
    // The Base64 string is the token without the last character.
    NSString *base64 = [token substringWithRange:NSMakeRange(0, token.length - 1)];
    // '-'s are '+'s and '_'s are '/'s.
    base64 = [base64 stringByReplacingOccurrencesOfString:@"-" withString:@"+"];
    base64 = [base64 stringByReplacingOccurrencesOfString:@"_" withString:@"/"];
    // Pad the Base64 string out with '='s
    NSUInteger paddedLength = base64.length + numberOfPaddingCharacters;
    base64 = [base64 stringByPaddingToLength:paddedLength withString:@"=" startingAtIndex:0];
    NSData *result = [[NSData alloc] initWithBase64EncodedString:base64 options:kNilOptions];
    return result;
}

您使用strlen()来获取长度,它是已经填充的长度,而不是base64Chars的大小,也不是java实现中的len - 1 + numPadChars。因此=填充可能无法填充。

你可以试试我的固定方法:

- (NSData *)UrlTokenDecode:(NSString *)input {
NSData *result;
NSUInteger len = [input length];
NSUInteger numPadChars = (int)[input characterAtIndex:len-1] - (int)'0';
if(numPadChars >10)
    return nil;
char* base64Chars = malloc(len+numPadChars); // no -1 because need a '' end
memset(base64Chars, 0, len+numPadChars);
for(int iter = 0 ; iter < len-1 ; iter++){
    char myChar = [input characterAtIndex:iter];
    switch (myChar) {
        case '-':
            base64Chars[iter] = '+';
            break;
        case '_':
            base64Chars[iter] = '/';
            break;
        default:
            base64Chars[iter] = myChar;
            break;
    }
}
for(int iter = len-1 ; iter < len+numPadChars-1; iter++){
    base64Chars[iter] = '=';
}
NSString* assembledString = [NSString stringWithCString:base64Chars encoding:NSASCIIStringEncoding];
result = [[NSData alloc] initWithBase64EncodedString:assembledString options:0];
free(base64Chars);
return result;
}

最新更新