arguments] Problem Objective-C


arguments] Problem Objective-C

我有NSProcessInfo's arguments属性的麻烦。我正在创建一个命令行工具,需要解码base64代码,它已经从互联网上通过使用PHP脚本,以及一些其他参数。数据传递正常,但由于某些原因。[[NSProcessInfo processInfo] arguments]返回21个参数,即使我只传递一个base64字符串。

这是objective-c的一面:

NSArray *arguments = [[NSProcessInfo processInfo] arguments];
if ([[arguments objectAtIndex:1] isEqualToString:@"-s"])
{
    if ([arguments objectAtIndex:2] == nil)
    {
        printf("Error: No data'n");
        [pool drain];
        return 0;
    }
    NSString*data = [arguments objectAtIndex:2];
    if ([data length] == 0)
    {
        printf("Error: No data'n");
        [pool drain];
        return 0;
    }
    NSString*password = @"";
    if ([[arguments objectAtIndex:3] isEqualToString:@"-p"])
    {
        if ([arguments objectAtIndex:4] == nil)
        {
            printf("Error: No password'n");
            [pool drain];
            return 0;
        }
        else
        {
            password = [NSString stringWithString:[arguments lastObject]];
        }
    }
NSLog(@"Args: %i'n'n",[arguments count]); //returns 21? I expect 3.

base64代码有点长,所以我把它放在这里。有人知道为什么这段代码返回这么多参数吗?应该只有一根弦吗?编辑:我剥离空白在我的PHP脚本。在这里看到的:

<?php
$url = $_GET['data'];
$query = "/Library/WebServer/email/emailsender -s";
$password = "-p somePassword";
$commandStr = trim("$query $url $password");
$commandStr = removeNewLines($commandStr);
echo $commandStr;
$output = shell_exec($commandStr);
echo "<pre>Output: $output</pre>";
function removeNewLines($string) {
    $string = str_replace( "'t", ' ', $string );
    $string = str_replace( "'n", ' ', $string );
    $string = str_replace( "'r", ' ', $string );
    $string = str_replace( "'0", ' ', $string );
    $string = str_replace( "'x0B", ' ', $string );
    return $string;
}
?>

当您通过命令行向程序发送参数时,每个参数由空白字符分隔。这意味着如果你发送一个包含空格的字符串,你的程序将把它解释为多个参数。为了防止这种行为,您需要给字符串加上引号。

当我在您的pastie页面上显示Base64字符串为"raw"时,我看到其中有很多空格。所以最有可能的arguments是正确的,你的PHP脚本调用Objective-C程序错误的方式。一个简单的修复方法可能是在传递字符串之前去掉所有空白,或者正确地转义它。