caracteres estranhos retornou de fluxo de bytes?
-
21-08-2019 - |
Pergunta
Ao tentar exibir um fluxo de bytes de HLDS (Half-Life Servidor Dedicado) em uma caixa de texto, exibe estranhas caracteres ponto de interrogação em blocos que algo parecido com isto:
[?]
Aqui está uma linha de amostra do fluxo de bytes (com no lugar do personagem estranho [?]):
CPU In Out Uptime Users FPS Players[?] 0.00 0.97 0.91 2806 182 297.25 1[?]
Aqui está como eu exibir o fluxo de bytes como uma string:
byte[] bytes = listener.Receive(ref sender); // get bytes from stream
TextBox1.Text = Encoding.ASCII.GetString(bytes, 0, bytes.Length); // write to textbox
Os caracteres estão aparecendo onde [CR][LF]
normalmente deve aparecer. Por que é mostrando caracteres estranhos, e o que posso fazer para remover os caracteres estranhos ou corrigir a codificação?
***** UPDATE *****
Jon Skeet deu a resposta certa. Os registos são retornando \ n para nova linha (não \ r \ n) e \ 0 no final de cada linha de registo transmitido. Substituído \ n com Environment.NewLine e \ 0 com string.Empty e os caracteres estranhos sumiram. Obrigado Jon.
Solução
Em primeiro lugar, eu acredito que se caixas de texto já recebem um personagem 0, eles vão assumir que é o fim dos dados - você pode querer proteger contra que, especificamente
.Onde o seu fluxo de bytes vem? O que a codificação é significava ser? Quais são os bytes nesse ponto nos dados?
Outras dicas
- Você tem certeza que os dados estão em ASCII puro? É, talvez, em um dos muitos, muitos códigos de páginas?
- É talvez por causa de [CR] vs [LF] vs [CR] [LF]?
- Você pode dizer usar os bytes que estão ao redor "Os jogadores ..."? E o que você espera ver? Nós pode ser capaz de reconhecer o código-página
Presumivelmente, o byte é quer na zona de página de código (128-255), ou os caracteres de controlo (0-31).
Você pode ter que substituí-los manualmente com personagens LINEBREAK que caixa de texto vai entender, ou você pode ter que fazer a sua caixa de texto multi-linha, se não é já.
Geekpedia diz a apenas certifique-se definir:
TextBox1.MultiLine = true
Depois de resposta:
Se alguns dos personagens aren'r CRLF, então você precisa examinar como você está recebendo-os.
Olhe para a saída real de Encoding.ASCII.GetString()
e ver o que está lá dentro.
Os de você exemplo são claramente personagens-end linha, uma vez que separar o cabeçalho da linha de dados. CRLF devem trabalhar em caixas de texto de várias linhas para que eu não tenho certeza do que está acontecendo lá (até que você verificar o conteúdo byte) -. Os outros caracteres podem ser substituídos com espaços (que é uma opção)
E, eu estou supondo que a fonte desta caixa de texto será corrigido, e não proporcional pois caso contrário não vai alinhar muito bem.