2011-04-06 6 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 –

답변

3

당신은 Stream.Read의 반환 값을 사용하고, 실제로 읽은 바이트의 문자열을 작성해야 읽을 데이터가 없어 질 때까지 스트림. StreamReader 당신이 문자열로 모두 변환하려는 경우, 단순히 정말 이렇게 도움이 될 수 있습니다

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

(난 당신이 다른 스트림을 폐쇄하고 있으리라 믿고있어, 또는 당신은 마지막에 StreamReader을 닫아야합니다 블록).

그런데 데이터가 항상 ASCII가 될 것이라고 확신합니까? 즉, 악센트 부호가있는 문자 등을 얻을 수 없다는 의미입니다.

광산과 Guffa의 답변을 읽은 후에도 여전히 불명확 한 점이 있다면 의 정확한 내용을으로 보내 주시기 바랍니다.

+0

감사합니다. Jon Skeet과 explainations 및 pointers 모두에게 감사드립니다. – k80sg

2

당신은 Read 방법의 반환 값을 무시하는 매우 일반적인 실수를하고있다.

이 메서드는 버퍼에 데이터를 읽고 버퍼에 있던 바이트 수를 반환합니다. 해당 반환 값을 무시하고 전체 버퍼를 디코딩하면 문자열은 버퍼만큼 길어지고 끝에 많은 가비지 데이터가 포함됩니다.

또한 Read 메서드는 0을 반환 할 때까지 반복적으로 호출해야합니다. 메서드가 한 번의 호출로 모든 데이터를 반환 할 필요가 없기 때문입니다. 각 바이트는 한 문자로 디코딩 될 때

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은 해당 바이트가 디코딩 된 문자 수입니다. 당신이 일반적으로에서 읽는 유지해야하지만,

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

참고 :

+0

을 참조하십시오. 물론 * 최대'buffSize' 바이트까지만 읽을 것입니다. 데이터가 남아 있지 않을 때까지 계속 움직여야합니다. 목표가 모든 것을 계속 읽는 것이고 서버 연결이 끊어지면 버퍼를 채운 후에 계속 읽어야합니다. 서버 *가 연결을 끊지 않을 경우, 버퍼가 채워질 때까지 읽는 것이 잠재적으로 응답하지 않을 수도 있습니다. 물론 서버가 버퍼 크기를 지정하지 않았다면 *. –

+0

@Jon Skeet : 예, 좋은 지적입니다. 코드는 버퍼가 항상 모든 데이터를 담을 수있을만큼 충분히 크다고 가정합니다. – Guffa