Question

Je le code suivant:

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

Le FILE_PATH est une chaîne const qui contient le chemin d'accès au fichier binaire en cours de lecture. Le fichier binaire est un mélange d'entiers et des caractères. Les entiers sont 1 octets chacun et chaque caractère est écrit dans le fichier en tant que 2 octets.

Par exemple, le fichier a les données suivantes:

1HELLO COMMENT SONT YOU45YOU RECHERCHONS // grand et ainsi de suite

S'il vous plaît noter: Chaque entier est associé à la chaîne de caractères suivants. Donc 1 est associé à « BONJOUR COMMENT ÊTES-VOUS » et 45 avec « VOUS CHERCHEZ DES GRANDS » et ainsi de suite.

Maintenant, le binaire est écrit (je ne sais pas pourquoi mais je dois vivre avec cela) de telle sorte que « 1 » prendra seulement 1 octet tandis que « H » (et d'autres caractères) prennent 2 octets chacun.

Voici donc ce que le fichier contient en fait:

0100480045..and ainsi de suite Heres la rupture:

01 est le premier octet pour le nombre entier 1 0048 sont les 2 octets pour 'H' (H 48 est en Hex) 0045 sont les 2 octets pour 'E' (E = 0x45)

et ainsi de suite .. Je veux que ma console pour imprimer un format lisible sur ce fichier: que je veux imprimer « 1 BONJOUR COMMENT ÊTES-VOUS » puis « 45 VOUS CHERCHEZ DES GRANDS » et ainsi de suite ...

Est-ce que je fais correctement? Y at-il un moyen plus facile / efficace?  Ma ligne Console.WriteLine (Convert.ToString (b [pos])); ne fait rien, mais imprime la valeur entière et non le caractère réel que je veux. Il est OK pour les entiers dans le fichier, mais alors comment puis-je lire les caractères?

Toute aide serait très appréciée. Merci

Était-ce utile?

La solution

Je pense que ce que vous cherchez est Encoding.GetString .

Étant donné que vos données de chaîne est composée de 2 caractères d'octets, comment vous pouvez obtenir votre chaîne en est:

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

Autres conseils

Vous pouvez utiliser chaîne System.Text.UnicodeEncoding.GetString () qui prend un octet tableau [] et produit une chaîne.

J'ai trouvé ce lien très utile

  

Notez que ce n'est pas la même chose que simplement copier aveuglément les octets de l'octet [] tableau dans un gros morceau de la mémoire et de l'appeler une chaîne. Procédé GetString () doit valider les octets et interdire les substituts non valides, par exemple.

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

}

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top