Domanda

Ho il seguente codice:

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++;
    }
}

Il FILE_PATH è un const string che contiene il percorso del file binario in lettura. Il file binario è una miscela di numeri interi e caratteri. Gli interi sono 1 byte ciascuno e ogni carattere viene scritto il file come 2 byte.

Ad esempio, il file ha i seguenti dati:

1HELLO COME VENGONO YOU45YOU CERCANDO GRANDE // e così via

Si prega di notare: Ogni intero è associato con la stringa di caratteri seguirla. Quindi 1 è associato a "CIAO come stai" e 45 con "STATE CERCANDO grande" e così via.

Ora il binario è scritto (non so perché, ma devo vivere con questo) tale che '1' avrà solo 1 byte mentre 'H' (e altri personaggi) prendono 2 byte ciascuno.

Così qui è quello che il file contiene in realtà:

0100480045..and così via Ecco la ripartizione:

01 è il primo byte per l'intero 1 0048 sono i 2 byte per 'H' (H è 48 in esadecimale) 0045 sono i 2 byte per 'E' (E = 0x45)

e così via .. Voglio che la mia console per stampare formato leggibile da questo file: Che voglio per stampare "1 CIAO come stai" e poi "45 si sta cercando grande" e così via ...

È quello che sto facendo è corretto? C'è un modo più semplice / efficiente?  La mia linea Console.WriteLine (Convert.ToString (b [pos])); non fa altro che stampa il valore intero e non il personaggio reale che voglio. E 'OK per gli interi nel file, ma poi come faccio a leggere i caratteri di?

Qualsiasi aiuto sarebbe molto apprezzato. Grazie

È stato utile?

Soluzione

Credo che quello che stai cercando è Encoding.GetString .

Dal momento che i dati stringa è composta da 2 caratteri a due byte, come è possibile ottenere la stringa out:

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++;
  }
}

Altri suggerimenti

È possibile utilizzare String System.Text.UnicodeEncoding.GetString () che prende un array di byte [] e produce una stringa.

Ho trovato questo link molto utile

  

Si noti che questa non è la stessa semplicemente copiando ciecamente i byte del byte [] array in un pezzo di memoria e chiamare una stringa. Il metodo GetString () deve convalidare i byte e proibiscono surrogati validi, per esempio.

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));

}

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top