[(NSInputStream *) чтение потока: buf maxLength: 1024]; возвращает очень большое значение

В строке кода

->NSInteger len = [(NSInputStream *)stream read:buf   maxLength:1024]; 

Я получаю очень большое значение len от этого метода, например: (18446744073709551615)

и вылетает

Завершение работы приложения из-за необработанного исключения «NSMallocException», причина: -[NSConcreteMutableData appendBytes:length:]: невозможно выделить память для длины (18446744073709551615)

case NSStreamEventHasBytesAvailable:

{



NSMutableData* lobjReadData = [[NSMutableData alloc] init];

NSNumber* lnumBytesRead;

uint8_t buf[1024];



NSUInteger lintReadingBufferLength = 0;

NSUInteger lintTotalBufferReadedlength = 0;

NSUInteger lintPreviousBufferReadedlength = 0;

NSUInteger lintSeenIndex = 0;



while ([(NSInputStream*)stream hasBytesAvailable])

{



    lintReadingBufferLength = [(NSInputStream *)stream read:buf

                                                  maxLength:1024];



    // some times i am getting very huge vaqlue of lintReadingBufferLength like

    //18446744073709551615

    //crashes here with crash log -> Terminating app due to uncaught exception 'NSMallocException', reason: '*** -[NSConcreteMutableData appendBytes:length:]: unable to allocate memory for length (18446744073709551615)'



    lintTotalBufferReadedlength += lintReadingBufferLength;



    if(lintReadingBufferLength)

    {

        [lobjReadData appendBytes:(const void *)buf

                           length:lintReadingBufferLength];



        // bytesRead is an instance variable of type NSNumber.

        lnumBytesRead = [NSNumber numberWithInteger:

                         [lnumBytesRead integerValue]+lintReadingBufferLength];





        NSArray* larrayOfBytes = [self arrayOfBytesFromData:lobjReadData];







        for (NSInteger lintIndexCounter = lintPreviousBufferReadedlength; lintIndexCounter < lintTotalBufferReadedlength;

             lintIndexCounter++)

        {

            NSObject* lobjByte = [larrayOfBytes objectAtIndex:lintIndexCounter];



            NSString* lstrMessage = [NSString stringWithFormat:@"%@",lobjByte];



            //doing some stuff here

        }



        lintPreviousBufferReadedlength = lintTotalBufferReadedlength;

    }

    else if(0 == lintReadingBufferLength)

    {



    }

    else

    {

        SLog(@"no buffer!");

    }



}



// SLog(@"--------------------------------------");



break;

}

person user4388479    schedule 29.04.2015    source источник


Ответы (2)


18446744073709551615 — это 0xffffffffffff, которое является максимальным 64-битным целым числом без знака, но также эквивалентно -1 как 64-битное целое число со знаком.

Если вы посмотрите на ссылку для [NSInputStream read:maxLength:] говорит:

Возвращаемое значение

Число, обозначающее результат операции:

  • Положительное число указывает количество прочитанных байтов;

  • 0 указывает, что достигнут конец буфера;

  • Отрицательное число означает, что операция не удалась.

Таким образом, операция не удалась, и вы просматриваете значение как значение без знака.

person trojanfoe    schedule 29.04.2015
comment
@user4388479 user4388479 Нет, это сбой сети, и они всегда случаются. Это просто означает, что соединение прервано или что-то в этом роде. - person trojanfoe; 29.04.2015
comment
Не используйте NSUInteger для отслеживания ответа, потому что ответ не подписан... - person Wain; 29.04.2015

Каков тип возвращаемого значения метода read:? Это NSUInteger? Это не так. Это NSInteger. Так почему же он возвращает целое число со знаком, а не целое число без знака? Это в документации метода read:. Прочтите эту документацию, и тогда вы должны знать, что необоснованно большое число на самом деле является ошибкой в ​​вашем коде, созданной с использованием NSUInteger вместо NSInteger.

person gnasher729    schedule 29.04.2015
comment
Ого, а я думал, что я тупой. - person trojanfoe; 29.04.2015