读取和写入数据流作为原始数据?

时间:2012-06-23 19:21:18

标签: objective-c ios5 stream xcode4.3 external-accessory

我通过外部附件框架打开了以下输入和输出流:

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)。

感谢您的耐心和帮助!

1 个答案:

答案 0 :(得分: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:,其中框架分配一个其选择长度的缓冲区。