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.

Foi útil?

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

  1. Você tem certeza que os dados estão em ASCII puro? É, talvez, em um dos muitos, muitos códigos de páginas?
  2. É talvez por causa de [CR] vs [LF] vs [CR] [LF]?
  3. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top