Strani personaggi tornati dal flusso di byte?
-
21-08-2019 - |
Domanda
Quando si tenta di visualizzare un flusso di byte da HLDS (Half-Life Server Dedicato) in una casella di testo, visualizza strani a blocchi caratteri interrogativi che sembrano qualcosa di simile:
[?]
Ecco una linea di campionamento dal flusso di byte (con al posto del personaggio strano [?]):
CPU In Out Uptime Users FPS Players[?] 0.00 0.97 0.91 2806 182 297.25 1[?]
Ecco come visualizzo il flusso di byte come una stringa:
byte[] bytes = listener.Receive(ref sender); // get bytes from stream
TextBox1.Text = Encoding.ASCII.GetString(bytes, 0, bytes.Length); // write to textbox
I caratteri vengono visualizzati in cui [CR][LF]
dovrebbe apparire normalmente. Perché è mostrando personaggi strani, e che cosa posso fare per rimuovere i caratteri strani o correggere la codifica?
***** UPDATE *****
Jon Skeet ha fornito la risposta giusta. I registri stanno tornando \ n per nuova riga (non \ r \ n) e \ 0 alla fine di ogni riga di registro in streaming. Sostituito \ n con Environment.NewLine e \ 0 con string.Empty e gli strani personaggi se ne sono andati. Grazie Jon.
Soluzione
In primo luogo, credo che se le caselle di testo sempre ricevono un carattere 0, assumeranno questa è la fine dei dati - si consiglia di evitare che specificamente
.Da dove viene il vostro flusso di byte viene? Che codifica è che significa essere? Quali sono i byte a quel punto i dati?
Altri suggerimenti
- Sei sicuro che i dati sono in puro ASCII? E 'forse in una delle molte, molte code-pagine?
- E 'forse a causa di [CR] vs [LF] vs [CR] [LF]
- Puoi dire utilizzare i byte che sono intorno a "I giocatori ..."? E che cosa si aspetta di vedere? We potrebbe essere in grado di riconoscere il codice-page
Presumibilmente il byte è o nella zona tabella codici (128-255), o caratteri di controllo (0-31).
Si potrebbe essere necessario sostituire manualmente con i caratteri LINEBREAK che textbox capirà, o potrebbe essere necessario rendere il vostro testo multi-linea, se non è già.
Geekpedia dice a solo assicurarsi di impostare:
TextBox1.MultiLine = true
Dopo la risposta:
Se alcuni dei personaggi aren'r CRLF, allora avete bisogno di esaminare come li stai ricevendo.
Guarda l'uscita effettiva dal Encoding.ASCII.GetString()
e vedere cosa c'è dentro.
Quelli in voi esempio sono chiaramente i caratteri line-end dal momento che separano il colpo di testa dalla linea dati. CRLF dovrebbe funzionare in caselle di testo multilinea, quindi non sono sicuro di quello che sta succedendo lì (fino a verificare il contenuto byte) - gli altri personaggi possono essere sostituiti con gli spazi (che è un'opzione)
.E, sto assumendo il carattere di questa casella di testo verrà risolto, non è proporzionale in quanto altrimenti non si allineano molto bene.