Pergunta

Eu tenho o seguinte código:

using (BinaryReader br = new BinaryReader(
       File.Open(FILE_PATH, FileMode.Open, FileAccess.ReadWrite)))
{
    int pos = 0;
    int length = (int) br.BaseStream.Length;

    while (pos < length)
    {
        b[pos] = br.ReadByte();
        pos++;
    }

    pos = 0;
    while (pos < length)
    {
        Console.WriteLine(Convert.ToString(b[pos]));
        pos++;
    }
}

O File_Path é uma string const que contém o caminho para o arquivo binário que está sendo lido. O arquivo binário é uma mistura de números inteiros e caracteres. Os números inteiros são 1 bytes cada e cada caractere é gravado no arquivo como 2 bytes.

Por exemplo, o arquivo possui os seguintes dados:

1hello como você está 45you parece ótimo // e assim por diante

Observação: cada número inteiro está associado à sequência de caracteres seguindo -a. Então, 1 está associado a "Hello How Are You" e 45 com "You Auxue Looking Great" e assim por diante.

Agora, o binário está escrito (não sei por que, mas tenho que viver com isso), de modo que '1' levará apenas 1 byte enquanto 'H' (e outros personagens) pega 2 bytes cada.

Então aqui está o que o arquivo realmente contém:

0100480045..e So Heres the Breakdown:

01 é o primeiro byte para o número inteiro 1 0048 são os 2 bytes para 'h' (h é 48 em hexadecimal) 0045 são os 2 bytes para 'e' (e = 0x45)

e assim por diante .. eu quero que meu console imprima o formato legível por humanos a partir deste arquivo: Que eu queira imprimir "1 Olá, como você" e depois "45 você está parecendo ótimo" e assim por diante ...

O que estou fazendo correto? Existe uma maneira mais fácil/eficiente? Meu console de linha.writeLine (convert.toString (b [pos])); Não faz nada além de imprime o valor inteiro e não o personagem real que eu quero. Não há problema para os números inteiros no arquivo, mas como faço para ler os personagens?

Qualquer ajuda seria muito apreciada. Obrigado

Foi útil?

Solução

Eu acho que o que você está procurando é Coding.getString.

Como os dados da sua string são compostos por caracteres de 2 bytes, como você pode obter sua string é:

for (int i = 0; i < b.Length; i++)
{
  byte curByte = b[i];

  // Assuming that the first byte of a 2-byte character sequence will be 0
  if (curByte != 0)
  { 
    // This is a 1 byte number
    Console.WriteLine(Convert.ToString(curByte));
  }
  else
  { 
    // This is a 2 byte character. Print it out.
    Console.WriteLine(Encoding.Unicode.GetString(b, i, 2));

    // We consumed the next character as well, no need to deal with it
    //  in the next round of the loop.
    i++;
  }
}

Outras dicas

Você pode usar o String System.Text.unicodeEncoding.getString () que pega uma matriz de byte [] e produz uma string.

Eu achei este link muito útil

Observe que isso não é o mesmo que apenas copiar cegamente os bytes da matriz de byte [] em um pedaço de memória e chamá -lo de string. O método getString () deve validar os bytes e proibir substitutos inválidos, por exemplo.

using (BinaryReader br = new BinaryReader(File.Open(FILE_PATH, FileMode.Open, FileAccess.ReadWrite)))
{    
   int length = (int)br.BaseStream.Length;    

   byte[] buffer = new byte[length * 2];
   int bufferPosition = 0;

   while (pos < length)    
   {        
       byte b = br.ReadByte();        
       if(b < 10)
       {
          buffer[bufferPosition] = 0;
          buffer[bufferPosition + 1] = b + 0x30;
          pos++;
       }
       else
       {
          buffer[bufferPosition] = b;
          buffer[bufferPosition + 1] = br.ReadByte();
          pos += 2;
       }
       bufferPosition += 2;       
   }    

   Console.WriteLine(System.Text.Encoding.Unicode.GetString(buffer, 0, bufferPosition));

}

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