Como faço para obter o comprimento (ou seja, número de caracteres) de uma string ASCII no vb.net?

StackOverflow https://stackoverflow.com/questions/1005164

Pergunta

Estou usando este código para retornar alguma string de um tcpclient, mas quando a string volta, ela tem uma liderança " personagem nele. Estou tentando removê -lo, mas o Len() A função está lendo o número de bytes em vez da própria string. Como posso alterar isso para me dar o comprimento da corda, pois normalmente a usaria e não da matriz subjacente à própria corda?

 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() Relata o número de bytes não o número de caracteres na string.

Foi útil?

Solução

Seu código está atualmente um pouco quebrado. A resposta é tcpClient.ReceiveBufferSize, independentemente de quantos dados você na realidade recebido - porque você está ignorando o valor de retorno de networkStream.Read. Pode estar retornando apenas alguns bytes, mas você está criando uma string usando o resto do bytes Array de qualquer maneira. Sempre Verifique o valor de retorno de Stream.Read, porque, caso contrário, você não sabe quantos dados foram realmente lidos. Você deve fazer algo como:

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)

Agora, o ASCII sempre possui um único caractere por byte (e vice -versa), para que o comprimento da string seja exatamente o mesmo que o comprimento dos dados que você recebeu.

Esteja ciente de que quaisquer dados não-ASCII (ou seja, algum bytes acima de 127) serão convertidos para '?' por Encoding.ASCII.GetString. Você também pode obter caracteres de controle. Definitivamente, são os dados de texto ASCII para começar? Caso contrário, eu recomendaria codificar hexadecimal ou usar outra opção para despejar os dados exatos de uma maneira não derrota.

Outras dicas

Você pode tentar aparar a corda dentro da chamada para Len ():

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

Se Len relatar o número de bytes e não corresponde ao número de caracteres, posso pensar em duas possibilidades:

  • Há mais chars sendo enviados do que você pensa (ou seja, esse personagem extra está realmente sendo enviado)

  • A codificação não é ASCII, portanto, pode haver mais de um byte por char (e um deles é o personagem "estranho", esse é o personagem que está sendo enviado e não é "dados errados"). Tente descobrir se os dados são realmente codificados ASCII, se não, altere a chamada de acordo.

Quando li você corretamente, você obtém uma única cotação no começo, certo?

Se você conseguir isso de forma consistente, por que não apenas subtrair um do comprimento da string? Ou use uma substring do segundo caractere:

Len(returndata.Substring(1)

E eu não entendo muito bem o que você quer dizer com o comprimento da corda, como eu normalmente a usaria e não da matriz subjacente à própria string «. Você tem uma string. Qualquer matriz que possa representar essa string internamente depende inteiramente dependente da implementação e nada em que você deve ver ou confiar. Ou estou entendendo você errado aqui. A corda é o que você está usando normalmente. Quero dizer, se não é isso que você faz, por que não tomar o comprimento da corda depois Processando -o em algo que você normalmente usaria?

Talvez eu esteja perdendo alguma coisa aqui, mas o que há de errado com String.Length?

Dim LL As Int32 = returndata.Length
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top