2016-10-18 68 views
1

編碼的NSString成NSInputStream後改變我試圖編碼時遇到下述問題的NSString作爲NSString - >NSData - >NSInputStream然後從NSInputStreamread方法進行解碼:字節通過NSData的

NSString *inputString = [NSString stringWithFormat:@"%c", 255]; 
NSData *data = [inputString dataUsingEncoding:NSUTF8StringEncoding]; 
NSInputStream *stream = [NSInputStream inputStreamWithData:data]; 
[stream open]; 
uint8_t bytes; 
[stream read:&bytes maxLength:1]; 
NSLog(@"%i", bytes); 

輸出是195而不是255。爲什麼?

回答

1

由於您用於字符串的編碼類型。 UTF-8是一種字符串編碼形式,它將最終將127以上的字符轉換爲多字節序列。因此,儘管inputString包含單個字符,但您的數據對象實際上並不包含單個字節,但您可能已假設有多個字節(本例中爲兩個字節)。當你從流中讀取數據時,你只能讀取編碼數據的第一個字節,但是那裏還有更多。

您不需要通過輸入流運行數據來查看此結果。訪問NSData實例的第一個字節會顯示相同的內容。

你說這是一個「問題」,但你不建議你想要實現什麼。 255不是可打印/有意義的文本字符。如果你想傳輸原始數據字節,你可以直接做,而不是使用NSString和字符串編碼。如果你正在傳輸字符串,那麼它已經在做正確的事情。你只需要做好準備,你的數據大小可以超過你的字符串「長度」。

+1

TIL,感謝您的解釋!這是我的單元測試的一部分,我期待着類似'XCTAssertEqual((int)bytes,255);'。 – yvetterowe

+0

沒問題。聽起來可能這只是一個無益的測試。祝你好運。 –