использование nsmutabledata для инициализации строки - PullRequest
0 голосов
/ 27 сентября 2011

Я пытаюсь получить мои данные из сокета в массив nsmutablearray.однако примеры и учебники, которые я нашел, показали, что сначала они идут в строку.это хорошо, я могу разобрать это оттуда.но я даже не могу заставить эту строку работать.

    case NSStreamEventHasBytesAvailable:
    {

        if(!rawData) {
            rawData = [[NSMutableData data] retain];
        }
        uint8_t buf[1024];
        unsigned int len = 0;
        len = [(NSInputStream *)theStream read:buf maxLength:1024];
        if(len) {
         [rawData initWithBytes:buf length:len];
            int bytesRead;
            bytesRead += len;

            [self messageReceived:rawData];

        } else {
            NSLog(@"no buffer!");
        }
        NSString *str = [[NSString alloc] initWithData:rawData 
                                              encoding:NSUTF8StringEncoding];
        NSLog(@"data buffer: %@ |~|string buffer%@",rawData,str);


        [str release];
        break;
    }

Но, как вы увидите из вывода ниже, строка никогда не получает никаких данных (ну, на самом деле, я думаю, что это проблема кодирования, и поэтому я думаю,он просто выглядит пустым)

2011-09-27 13: 14: 06.356 Буфер данных Cameleon [30095: 207]: <0f000102> | ~ | строковый буфер

2011-09-27 13: 14: 06.359 Cameleon [30095: 207] буфер данных: <02000400 000003> | ~ | строковый буфер

2011-09-27 13: 14: 06.458 Cameleon [30095: 207] буфер данных:<05000500 00020300> | ~ | строковый буфер

2011-09-27 13: 14: 06.659 Буфер данных Cameleon [30095: 207]: <05000b00 0008080e 13163809 2711> | ~ | строковый буфер

2011-09-27 13: 14: 06.663 Буфер данных Cameleon [30095: 207]: <05000700 00040101 005a> | ~ | строковый буфер

я хочу, чтобы строковый буфер отражал значениябуфер данных или массив с каждым байтом буфера данных

ОТВЕТ:

case NSStreamEventHasBytesAvailable:
        {

            if(!rawData) {
                rawData = [[NSMutableData data] retain];
            }
            uint8_t buf[1024];
            unsigned int len = 0;
            len = [(NSInputStream *)theStream read:buf maxLength:1024];
            if(len) {
             [rawData initWithBytes:buf length:len];                
            } else {
                NSLog(@"no buffer!");
            }

            const uint8_t *bytes = [rawData bytes];

            NSMutableArray *mutableBuffer = [[NSMutableArray alloc] initWithCapacity:len];  

            for (int i =0; i < [rawData length]; i++) {
                [mutableBuffer addObject:[NSString stringWithFormat:@"%02X", bytes[i]]];
            }
            [self gateKeeper:mutableBuffer];


            [mutableBuffer release];
            break;

1 Ответ

0 голосов
/ 27 сентября 2011

Ваш код имеет несколько проблем. Во-первых, это не обычный шаблон для выделения объекта NSData:

rawData = [[NSMutableData data] retain];

Хотя это технически правильно с точки зрения управления памятью, оно не является идиоматическим и приводит к отправке ненужной пары сообщений autorelease и retain. Вместо этого должно быть так:

rawData = [[NSMutableData alloc] init];

Во-вторых, этот код бесполезен:

int bytesRead;
bytesRead += len;

Вы объявляете переменную, не можете ее инициализировать, добавляете к ней len (что технически является неопределенным поведением, но на x86 это будет безопасно), а затем ничего не делаете с ней. Возможно, вы захотите использовать долгоживущую переменную, объявленную вне этого блока, и правильно ее инициализировать.

Наконец, настоящая причина вашей проблемы заключается в том, что данные, которые вы получаете, не являются текстом UTF-8. Это некие двоичные данные со встроенными символами NUL (нулевые байты). Когда они преобразуются в строки, NUL сигнализируют об окончании строки, поэтому после них ничего не печатается.

Просто сохраните данные как NSData, не пытайтесь преобразовать их в строку, если это не текстовые данные. С какими данными вы имеете дело? Откуда это?

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