2011-09-27 104 views
0

我试图让我的数据从套接字检索到一个nsmutablearray。然而我发现的例子和教程显示它首先进入字符串。这很好,我可以从那里解析出来。但我甚至不能得到这个字符串的东西工作。使用nsmutabledata初始化字符串

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卡默莱昂[30095:207]数据缓冲器:< 0f000102> |〜|字符串缓冲区

2011-09-27 13:14:06.359卡默莱昂[30095:207]的数据缓冲区中 000003> |〜|字符串缓冲区

2011-09-27 13:14:06.458卡默莱昂[30095:207]数据缓冲器: 00020300> |〜|字符串缓冲区

2011-09-27 13:14:06.659卡默莱昂[30095: 207]数据缓冲器:< 05000b00 0008080e 13163809 2711> |〜|字符串缓冲区

2011-09-27 13:14:06.663卡默莱昂[30095:207]数据缓冲器: 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; 

回答

0

您的代码有几个问题:字符串缓冲区与数据缓冲器的每个字节

ANSWER镜像的DataBuffer 的值或数组。首先,这是不分配一个NSData对象通常的模式:在存储器管理方面

rawData = [[NSMutableData data] retain]; 

虽然技术上是正确的,它的非惯用的和不必要的对autoreleaseretain消息的结果得到发送。这应该不是这样:

rawData = [[NSMutableData alloc] init]; 

其次,这段代码是没用的:

int bytesRead; 
bytesRead += len; 

你声明一个变量,无法初始化它,添加len它(这在技术上是未定义行为,但在x86上这将是无害的),然后无所作为。您可能想要使用在该块之外声明的更长寿命的变量并正确初始化它。

最后,问题的实际原因是您收到的数据不是UTF-8文本。它是一些嵌入NUL字符的二进制数据(零字节)。当这些被转换为字符串时,NULs表示字符串终止,所以没有打印出来。

只要保留您拥有的数据为NSData,如果它不是真正的文本数据,请不要试图将其转换为字符串。你处理什么样的数据?它来自哪里?

+0

bytesread的东西,并保留选项从我正在阅读的教程(保留我可以发誓我从苹果开发网站获得)在任何情况下,我需要将NSDATA放入NSARRAY或NSMUTABLEARRAY,所以我可以与它一起工作(解析它)。 –

+0

我需要能够操作/解析个别字节 –

+0

这里是使用保留的链接。 http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Streams/Articles/ReadingInputStreams.html#//apple_ref/doc/uid/20002273-BCIJHAGD即时通讯不会这样说,我的权利,但有点说为什么;他们使用保留? (但不像主要问题那么重要) –