Objective C объекты ведут себя странно (используя старые ссылки) - PullRequest
0 голосов
/ 03 августа 2010

Я получаю очень странное поведение в своей библиотеке Objective C (для iPhone).То, что я пытаюсь сделать, - это принять входящие пакеты (вне вспомогательного порта), добавить их в переменную экземпляра NSMutableData, а затем проверить, есть ли у меня полные пакеты.Если я это сделаю, метод [containsPacket] вернет длину пакета, в противном случае он вернет -1.Если он содержит пакет, я создаю новый объект RASPPacket с этими данными и обновляю свой объект receiveData с остальными данными (вычитая данные, с которыми я только что создал RASPPacket).Я перебираю это до тех пор, пока длина <0 (что означает, что в ReceiveData больше нет полных пакетов). </p>

Когда я передаю ему один полный пакет, он работает как следует (containsPacket возвращает правильную длину, а ReceiveData становитсяпустой NSMutableData).Странная вещь заключается в том, что при втором вызове containsPacket он все равно возвращает тот же номер (13), даже несмотря на то, что receiveData пуст.Я поместил туда несколько NSLogs, чтобы посмотреть, что происходит (так как я отсоединен от компьютера, я не могу пройти через отладчик), вывод которого ниже.

- (void)receive:(NSData *)packet {

    [receivedData appendData:packet];

    NSMutableString *dataString = [[NSMutableString alloc] init];
    unsigned char *ptr = (unsigned char *)[receivedData bytes];

    for(int i = 0; i < [receivedData length]; i++) {

        [dataString appendFormat:@"%02X ", ptr[i]];
    }

    NSLog(@"Received data: %@", dataString);

    int length = [RASPPacket containsPacket:receivedData];
    NSLog(@"length is %i", length);

    while(length > 0) {

        RASPPacket *receivedPacket = [[RASPPacket alloc] initWithIncomingPacket:[NSData dataWithBytes:[receivedData bytes] length:length]];

        [receivedData setData:[NSMutableData dataWithBytes:([receivedData bytes]+length) length:([receivedData length] - length)]];

        dataString = [[NSMutableString alloc] init];
        ptr = (unsigned char *)[receivedData bytes];

        for(int i = 0; i < [receivedData length]; i++) {

            [dataString appendFormat:@"%02X ", ptr[i]];
        }

        NSLog(@"new received data: %@", dataString);

        if([receivedPacket isValidPacket]) {

            [raspObject receive:receivedPacket];
            NSLog(@"Complete packet is valid");
        }

        [receivedPacket release];

        length = [RASPPacket containsPacket:receivedData];
        NSLog(@"length is %i", length);
    }
}

И Содержит пакетМетод:

+ (int)containsPacket:(NSData *)thePacket {

    //Return -1 by default (if it doesn't contain a complete packet)
    int returnValue = -1;

    unsigned char *data = (unsigned char *)[thePacket bytes];

    NSMutableString *dataString = [[NSMutableString alloc] init];
    unsigned char *ptr = (unsigned char *)[thePacket bytes];

    for(int i = 0; i < [thePacket length]; i++) {

        [dataString appendFormat:@"%02X ", ptr[i]];
    }

    NSLog(@"containsPacket data: %@, len %i", dataString, [thePacket length]);

    NSLog(@"beginning return value %i", returnValue);

    //DLE counts the number of consecutive DLE bytes (0x10). An odd number means
    //we found the DLE we want, an even means it's just in a sequence in the message data 
    int dleCount = 0;
    NSLog(@"a return value %i", returnValue);

    //Start i at 2 to skip 0x10 0x01
    for(int i = 2; (i < ([thePacket length] - 1)) && returnValue < 0; i++) {

        NSLog(@"b return value %i, i: %i, len: %i", returnValue, i, [thePacket length] - 1);
        //Check if we found 0x10 and 0x03 and there are at least three bytes extra (0x03 and checksum)
        if(data[i] == 0x10 && data[i+1] == 0x03 && [thePacket length] - 3 > i) {

            int j = i - 1;
            dleCount = 1;

            while(data[j] == 0x10 && j >= 0) {
                dleCount++;
                j--;
            }

            if(dleCount % 2) {

                //Add 1 to convert to indices to length, 1 to go from 0x10 to 0x03, and 2 for checksum
                returnValue = i + 2 + 1 + 1;
                NSLog(@"c return value %i", returnValue);
            }
        }
    }

    NSLog(@"ending return value %i", returnValue);
    return returnValue;
}

И, наконец, вывод NSLog:

TestRaspLayer[922:6c03] Received data: 10 01 00 01 01 10 02 00 00 10 03 A1 07 

TestRaspLayer[922:6c03] containsPacket data: 10 01 00 01 01 10 02 00 00 10 03 A1 07 , len 13

TestRaspLayer[922:6c03] beginning return value -1

TestRaspLayer[922:6c03] a return value -1

TestRaspLayer[922:6c03] b return value -1, i: 2, len: 12

TestRaspLayer[922:6c03] b return value -1, i: 3, len: 12

TestRaspLayer[922:6c03] b return value -1, i: 4, len: 12

TestRaspLayer[922:6c03] b return value -1, i: 5, len: 12

TestRaspLayer[922:6c03] b return value -1, i: 6, len: 12

TestRaspLayer[922:6c03] b return value -1, i: 7, len: 12

TestRaspLayer[922:6c03] b return value -1, i: 8, len: 12

TestRaspLayer[922:6c03] b return value -1, i: 9, len: 12

TestRaspLayer[922:6c03] c return value 13

TestRaspLayer[922:6c03] ending return value 13

TestRaspLayer[922:6c03] length is 13

TestRaspLayer[922:6c03] new received data: 

TestRaspLayer[922:6c03] RASP receive, interface: 1, command 1, looking for interface: 9, command 1

TestRaspLayer[922:6c03] Complete packet is valid

TestRaspLayer[922:6c03] containsPacket data: , len 0

TestRaspLayer[922:6c03] beginning return value -1

TestRaspLayer[922:6c03] a return value -1

TestRaspLayer[922:6c03] b return value -1, i: 2, len: -1

TestRaspLayer[922:6c03] b return value -1, i: 3, len: -1

TestRaspLayer[922:6c03] b return value -1, i: 4, len: -1

TestRaspLayer[922:6c03] b return value -1, i: 5, len: -1

TestRaspLayer[922:6c03] b return value -1, i: 6, len: -1

TestRaspLayer[922:6c03] b return value -1, i: 7, len: -1

TestRaspLayer[922:6c03] b return value -1, i: 8, len: -1

TestRaspLayer[922:6c03] b return value -1, i: 9, len: -1

TestRaspLayer[922:6c03] c return value 13

TestRaspLayer[922:6c03] ending return value 13

TestRaspLayer[922:6c03] length is 13

Первый раз, когда он проверяет действительные данные, второй раз, когда это не так, и не долженпродолжить через цикл for (так как i> [thePacket length] -1).

1 Ответ

0 голосов
/ 03 августа 2010
for(int i=2; (i<([thePacket length]-1)) && returnValue<0; i++)

[thePacket length]-1 будет очень большим числом (для пустого пакета), так как длина без знака int.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...