-1

我有应用程序,我从套接字消息接收到:"\r\nIDLE|03/17/2013 19:48\n"。我将此消息转换为带有代码的 UTF8 字符串:

NSString* newStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

然后我尝试从这个字符串中分离命令和时间:

NSArray *nums = [command componentsSeparatedByString:[NSString stringWithFormat:@"%c", (char)13]];
NSLog(@"First separate = %@", nums);
if ([nums count] == 3)
{
    NSArray *nums1 = [[nums objectAtIndex:1] componentsSeparatedByString:@"|"];
    NSLog(@"second separate = %@", nums1);
    if ([nums1 count] == 2)
    {
        NSString* strState = [(NSString *)[nums1 objectAtIndex:0] description];
        NSLog(@"State = %@", strState);

        ...
    }
}

在我接下来看到的日志中:

    First separate = (
    "IDLE|03/17/2013 19:48",
    "\n"
second separate = (
    "IDLE",
    "03/17/2013 19:48"
State = I

在 0 元素中第二次分离后,我有文本IDLE,但是当我尝试获取此文本时,我 strState变量,我只看到此文本的第一个字符。任何人都可以帮助我完全掌握这个元素吗?

谢谢你。

UPDATE1 正如我之前所说,我从套接字消息中得到:“\r\nIDLE|03/17/2013 19:48\n” 我确信服务器会向我发送此消息。在 Socket 读取回调中,我使用下一个代码来读取此消息:

int result = CFReadStreamRead(_inputStream, (UInt8*)[data mutableBytes], length);
NSString* newStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

这里应用程序读取了 50 个字节,这是否适合此消息?您可以在下一张图片中看到我的调试器: 套接字中的调试器

但在newStr成员中,我只看到\r。然后我发送尝试将这条消息与我上面编写的代码分开。当我尝试单独的消息记录器时,显示所有消息而不是\r分开后的数组 谢谢

4

2 回答 2

0

有一种相当简单的方法可以使用该方法完成您想要的-[NSString stringByTrimmingCharactersInSet:]。传递空格和换行符集允许您从字符串中修剪前导和尾随空格和换行符,然后您只需要对componentsSeparatedByString:.

NSString *raw = @"\r\nIDLE|03/17/2013 19:48\n";
NSString *trimmedString = [raw stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
NSArray *components = [trimmedString componentsSeparatedByString:@"|"];
NSString *command = components[0];
NSString *time = components[1];
NSLog(@"command = %@, time = %@",command,time);

此代码产生以下输出:

command = IDLE, time = 03/17/2013 19:48
于 2013-03-17T19:26:29.410 回答
0

您是否考虑过使用 sscanf()?

  char command[COMMAND_SIZE_LIMIT];   
  char date[DATE_SIZE_LIMIT];
  char time[TIME_SIZE_LIMIT];

  sscanf (input, "\r\n%[^|]%*[|]%s%s\n", command, date, time);

(注意:以上是示例代码;如果扫描的字符串包含过大的命令或日期时间子字符串,则会出现安全问题。)

# test
ebg@ebg$ ./foo
Input: '
IDLE|03/17/2013 19:48
'
Command: 'IDLE'
Date: '03/17/2013'
Time: '19:48'

转换 NSString <==> C 字符串很容易。

于 2013-03-17T18:47:10.877 回答