2011-09-27 133 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即時通訊不會這樣說,我的權利,但有點說爲什麼;他們使用保留? (但不像主要問題那麼重要) –