문제

이 코드를 사용하여 tcpclient에서 일부 문자열을 반환하지만 문자열이 다시 오면 선두가 있습니다. " 그 안의 캐릭터. 나는 그것을 제거하려고하지만 Len() 함수는 문자열 자체 대신 바이트 수를 읽습니다. 문자열 자체의 기본 배열이 아닌 정상적으로 사용하려는 문자열의 길이를 제공하기 위해 어떻게 변경할 수 있습니까?

 Dim bytes(tcpClient.ReceiveBufferSize) As Byte
 networkStream.Read(bytes, 0, CInt(tcpClient.ReceiveBufferSize))

 ' Output the data received from the host to the console.'
 Dim returndata As String = Encoding.ASCII.GetString(bytes)

 Dim LL As Int32 = Len(returndata)

Len() 문자열의 문자 수가 아닌 바이트 수를보고합니다.

도움이 되었습니까?

해결책

코드는 현재 다소 깨졌습니다. 정답은 tcpClient.ReceiveBufferSize, 얼마나 많은 데이터에 관계없이 실제로 수신 - 반환 값을 무시하고 있기 때문입니다 networkStream.Read. 몇 바이트 만 반환 할 수 있지만 나머지 부분을 사용하여 문자열을 생성합니다. bytes 어쨌든 배열. 언제나 반환 값을 확인하십시오 Stream.Read, 그렇지 않으면 실제로 얼마나 많은 데이터를 읽었는지 알 수 없습니다. 당신은 다음과 같은 일을해야합니다.

Dim bytesRead = networkStream.Read(bytes, 0, CInt(tcpClient.ReceiveBufferSize))

' Output the data received from the host to the console.'
Dim returndata As String = Encoding.ASCII.GetString(bytes, 0, bytesRead)

이제 ASCII는 항상 바이트 당 단일 문자를 가지므로 문자열의 길이는받은 데이터의 길이와 정확히 동일합니다.

비 ASCII 데이터 (예 : 127을 초과하는 바이트)는 '?'로 변환 될 것입니다. ~에 의해 Encoding.ASCII.GetString. 제어 캐릭터도 얻을 수도 있습니다. 이것은 확실히 ASCII 텍스트 데이터로 시작합니까? 그렇지 않은 경우, 16 진수를 인코딩하거나 다른 옵션을 사용하여 정확한 데이터를 손상하지 않는 방식으로 덤프하는 것이 좋습니다.

다른 팁

Len ()에 대한 호출 내부의 문자열을 트리밍 할 수 있습니다.

Dim LL As Int32 = Len(returndata.Trim())

Len이 바이트 수를보고하고 문자 수와 일치하지 않으면 두 가지 가능성을 생각할 수 있습니다.

  • 당신이 생각하는 것보다 더 많은 숯이 전송되고 있습니다 (즉, 추가 캐릭터가 실제로 전송되고 있습니다)

  • 인코딩은 ASCII가 아니므로 숯 당 하나 이상의 바이트가있을 수 있습니다 (그 중 하나는 '이상한'캐릭터, 즉 캐릭터가 전송되고 '잘못된 데이터'가 아니라는 것입니다). 데이터가 실제로 ASCII 인코딩되어 있는지 확인하십시오. 그렇지 않은 경우에 따라 호출을 변경하십시오.

내가 당신을 올바르게 읽을 때, 당신은 처음에 단일 따옴표를 얻습니다.

당신이 그것을 일관되게 얻는다면 왜 스트링 길이에서 그것을 빼지 않습니까? 또는 두 번째 문자의 하위 문자열을 사용하십시오.

Len(returndata.Substring(1)

그리고 나는 문자열 자체의 기본 배열이 아닌 정상적으로 사용하는 문자열의 길이»로 당신이 의미하는 바를 이해하지 못합니다. 당신은 문자열이 있습니다. 해당 문자열을 내부적으로 나타내는 배열은 전적으로 구현에 따라 다르며 보거나 의존해야 할 것은 없습니다. 아니면 내가 당신을 잘못 이해하고 있습니까? 문자열 ~이다 정상적으로 사용하는 것. 내 말은, 그것이 당신이하는 일이 아니라면, 끈의 길이를 가져 가지 않겠습니까? ~ 후에 일반적으로 사용하는 것으로 처리합니까?

어쩌면 나는 여기서 뭔가를 놓치고 있을지 모르지만 무슨 일이 있었는지 String.Length?

Dim LL As Int32 = returndata.Length
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top