-1

「\r\ nIDLE | 03/17/201319: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要素で2番目に分離した後、テキストIDLEがありますが、このテキストI strState変数を取得しようとすると、このテキストの最初の文字のみが表示されます。誰かが私がこの要素の完全なコマンドを取得するのを手伝ってもらえますか?

ありがとうございました。

UPDATE1 前に言ったように、「\ r \ nIDLE | 03/17/2013 19:48\n」のようなソケットメッセージから取得し ます。サーバーからこのメッセージが送信されると確信しています。Socket readコールバックでは、次のコードを使用してこのメ​​ッセージを読み取ります。

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

ここでアプリは50バイトを読み取り、これはこのメッセージに適していますか?次の図で、この時点で私のデバッガーを確認できます。 ソケット内のデバッガー

しかし、newStrメンバーには、\rしか表示されません。次に、このメッセージを上記のコードと分けて送信します。別のメッセージロガーを試してみると、\ rの代わりにすべてのメッセージが表示されます: 分離後の配列 ありがとう

4

2 に答える 2

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 に答える
0

この方法を使用して、目的を達成するためのかなり簡単な方法があります-[NSString stringByTrimmingCharactersInSet:]。空白と改行の文字セットを渡すと、文字列から先頭と末尾の空白と改行を削除できます。その後、を1回呼び出すだけで済みます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 に答える