чтение и запись данных в потоки в виде необработанных данных?

Я открыл следующие входные и выходные потоки через External Accessory Framework:

session = [[EASession alloc] initWithAccessory:acc forProtocol:protocol];

        if (session){
            [[session inputStream] setDelegate:self];
            [[session inputStream] scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
            [[session inputStream] open];

            [[session outputStream] setDelegate:self];
            [[session outputStream] scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
            [[session outputStream] open];
        }

Теперь у меня очень глупый вопрос, как и большинство моих вопросов новичков. Как я могу отправить в поток необработанные 1-байтовые фрагменты данных? Скажем, я хочу отправить 0x06. Как я могу это сделать?

И потом... как мне прочитать данные из потока? Мне будут отправлены данные для обработки байт за байтом... байты будут числами в диапазоне байтов (0x00 - 0xFF).

Спасибо за терпение и помощь!


person Jay Kim    schedule 23.06.2012    source источник


Ответы (1)


Запись данных побайтно не самый эффективный способ, но если вы настаиваете:

uint8_t aByte = 0x06;
if ([[session outputStream] write:&aByte maxLength:1] < 0)
    /* handle error */;

Аналогично, чтобы читать побайтно:

uint8_t aByte;
NSInteger result = [[session inputStream] read:&aByte maxLength:1];
if (result > 0)
    /* handle received byte */;
else if (result == 0)
    /* handle end-of-stream */;
else
    /* handle error */;

Если вы хотите читать или записывать большие фрагменты данных, передайте указатель на буфер размером более одного байта и укажите длину. Обязательно обрабатывайте короткие операции чтения и записи, когда код возврата положительный, но меньше, чем вы указали. Вам нужно подождать, пока поток будет готов к большему, и продолжить с того места, где он остановился. Для чтения вы также можете использовать -getBuffer:length:, где фреймворк выделяет буфер длины по своему выбору.

person Ken Thomases    schedule 23.06.2012
comment
Еще один глупый вопрос: как я могу напечатать aByte в NSLog? Когда я делаю NSLog(@%@, aByte) или NSLog(@%s, aByte)... программа вылетает. - person Jay Kim; 24.06.2012
comment
Спецификатор формата %@ обрабатывает соответствующий аргумент как указатель объекта. %s рассматривает его как указатель строки C с непредсказуемой кодировкой. Сбой связан с тем, что aByte не является допустимым указателем любого типа, поэтому его разыменование приводит к доступу к недопустимому адресу. Для aByte вы можете использовать либо %hhu (для десятичного), либо %hhx (для шестнадцатеричного). u и x означают целочисленный тип без знака. Один h означает короткий int, а hh означает char (что лежит в основе типа uint8_t). - person Ken Thomases; 24.06.2012