2011-04-06 116 views
0

我試圖抓住readData的字符串長度,但當我嘗試msgbox(readData.Length)時,它給我一個大數字數字代替。任何人都在意幫忙嗎?謝謝。麻煩讀取字符串長度

Dim readData as string 
serverStream.Read(inStream, 0, buffSize) 
       Dim returndata As String = _ 
       System.Text.Encoding.ASCII.GetString(inStream) 
       readData = "" + returndata 
       msg() 
+1

請參閱http://meta.stackexchange.com/questions/16721/how-does-accept-rate-work – 2011-04-06 16:29:02

回答

3

您需要使用Stream.Read的返回值,只有創建實際已讀取的字節串:但是

Dim bytesRead = serverStream.Read(inStream, 0, buffSize) 
Dim text = Encoding.ASCII.GetString(inStream, 0, bytesRead) 

注意的是,你應該通常繼續閱讀直到沒有更多數據要讀取爲止。 StreamReader可以幫你做到這一點真的很簡單,如果你想一切轉換爲字符串:

Dim text = new StreamReader(serverStream, Encoding.ASCII).ReadToEnd() 

(我假設你在其他地方關閉流;或者,你應該在最後關閉StreamReader塊)。

順便說一下,你確定數據總是ASCII嗎?這意味着你將永遠不會得到任何重音字符等

如果有什麼是還在讀礦和Guffa的回答後不清楚,請你想做什麼張貼正是更多細節。

+0

感謝Jon Skeet和所有的解釋和指針。 – k80sg 2011-04-07 03:43:35

2

您正在犯一個忽略Read方法返回值的常見錯誤。

該方法將數據讀入緩衝區,並返回放置在緩衝區中的字節數。通過忽略該返回值並解碼整個緩衝區,該字符串將與緩衝區一樣長,並在最後包含大量垃圾數據。

此外,您必須重複調用Read方法,直到它返回零,因爲該方法不必在一次調用中返回所有數據。

Dim readData As string 
Dim length As Integer = 0 
Dim size As Integer 
Do 
    size = serverStream.Read(inStream, length, buffSize - length) 
    length += size 
Loop Until size = 0 
readData = System.Text.Encoding.ASCII.GetString(inStream, 0, length) 

MessageBox.Show(length.ToString()) 
MessageBox.Show(readData.Length.ToString()) 

作爲正在使用的ASCII編碼,lengthreadData.Length將是相同的,因爲每個字節被解碼成一個字符。例如,如果您使用UTF-8編碼,則它們可能會有所不同,因爲length將是讀取的字節數,readData.Length將是這些字節解碼到的字符數。

+0

這仍然只會讀* * buffSize'字節,當然 - 它不會去繼續前進,直到沒有數據。如果目標是繼續閱讀所有內容並且服務器將斷開連接,那麼在填充緩衝區之後,他需要繼續閱讀。如果服務器*不會斷開連接,那麼讀取直到緩衝區被填充爲止*也可能會掛起。當然,除非已經通過服務器指定了緩衝區大小。 – 2011-04-06 16:22:02

+0

@Jon Skeet:是的,這是一個很好的觀點。該代碼假定緩衝區總是足夠大以容納所有數據。 – Guffa 2011-04-06 16:23:20