2011-04-06 119 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