Come posso ottenere la lunghezza (ovvero il numero di caratteri) di una stringa ASCII in VB.NET?

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

Domanda

Sto usando questo codice per restituire una stringa da un tcpclient ma quando la stringa ritorna ha al suo interno un carattere " . Sto cercando di rimuoverlo ma la funzione Len () sta leggendo il numero di byte anziché la stringa stessa. Come posso alterarlo per darmi la lunghezza della stringa come la userei normalmente e non dell'array che sta alla base della stringa stessa?

 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 () riporta il numero di byte e non il numero di caratteri nella stringa.

È stato utile?

Soluzione

Il tuo codice è attualmente alquanto rotto. La risposta è tcpClient.ReceiveBufferSize , indipendentemente dalla quantità di dati effettivamente ricevuti, poiché stai ignorando il valore di ritorno da networkStream.Read . Potrebbe restituire solo pochi byte, ma stai comunque creando una stringa utilizzando comunque il resto dell'array bytes . Sempre controlla il valore di ritorno di Stream.Read , perché altrimenti non sai quanti dati sono stati effettivamente letti. Dovresti fare qualcosa del tipo:

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)

Ora, ASCII ha sempre un singolo carattere per byte (e viceversa), quindi la lunghezza della stringa sarà esattamente uguale alla lunghezza dei dati che hai ricevuto.

Essere consapevoli del fatto che tutti i dati non ASCII (vale a dire qualsiasi byte oltre 127) saranno convertiti in '?' di Encoding.ASCII.GetString . Puoi anche ottenere personaggi di controllo. Si tratta sicuramente di dati di testo ASCII per cominciare? In caso contrario, consiglierei di codificarlo in modo esadecimale o di utilizzare un'altra opzione per scaricare i dati esatti in modo non dispersivo.

Altri suggerimenti

Potresti provare a tagliare la stringa all'interno della chiamata a Len ():

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

Se Len riporta il numero di byte e non corrisponde al numero di caratteri, allora posso pensare a due possibilità:

  • Ci sono più caratteri inviati di quanto si pensi (cioè, quel personaggio extra viene effettivamente inviato)

  • La codifica non è ASCII, quindi possono esserci più di un byte per carattere (e uno di questi è quel carattere "strano", cioè il carattere che viene inviato e non "dati errati"). Prova a scoprire se i dati sono realmente codificati ASCII, altrimenti modifica la chiamata di conseguenza.

Quando ti leggo correttamente, all'inizio ricevi una virgoletta, giusto?

Se lo ottieni in modo coerente, perché non sottrarre solo uno dalla lunghezza della stringa? Oppure usa una sottostringa del secondo carattere:

Len(returndata.Substring(1)

E non capisco bene cosa intendi con & # 187; la lunghezza della stringa come la userei normalmente e non dell'array che sta alla base della stringa stessa & # 171 ;. Hai una stringa. Qualsiasi array che potrebbe rappresentare quella stringa internamente dipende interamente dall'implementazione e nulla su cui dovresti vedere o fare affidamento. O ti sbaglio qui. La stringa è ciò che stai usando normalmente. Voglio dire, se non è quello che fai, perché non prendere la lunghezza della stringa dopo trasformandola in qualcosa che normalmente useresti?

Forse mi manca qualcosa qui, ma cosa c'è di sbagliato in String.length ?

Dim LL As Int32 = returndata.Length
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top