2012-06-23 69 views
0

我已经通过外部附件框架打开下面的输入和输出流:作为原始数据读取和写入数据流?

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

写入数据逐字节是不是最有效的方式,但如果你坚持:

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:,框架分配一个长度的缓冲区。

+0

另一个愚蠢的问题:我如何打印aByte到NSLog?当我做NSLog(@“%@”,aByte)或NSLog(@“%s”,aByte)...程序崩溃。 –

+1

“%@”格式说明符将相应的参数视为对象指针。 “%s”将其视为不可预测编码的C字符串指针。崩溃是因为'aByte'不是任何类型的有效指针,所以取消引用它会访问无效地址。对于'aByte',可以使用“%hhu”(十进制)或“%hhx”(十六进制)。 “u”和“x”表示无符号整数类型。一个“h”表示“short int”,而“hh”表示“char”(这是“uint8_t”类型的基础)。 –

相关问题