2010-03-03 3 views
3

J'ai un programme en écriture enregistrer un fichier texte en utilisant l'interface stdio. Il échange le 4 MSB avec le 4 LSB, sauf les caractères CR et/ou LF. J'essaie de "décoder" ce flux en utilisant un programme C#, mais je suis incapable d'obtenir les octets d'origine. J'ai essayé de changer le codage en UTF8, mais cela n'a pas fonctionné. J'ai aussi utilisé un BinaryReader créé en utilisant le 'Streamreader' 'sr', mais rien de bon n'est arrivé.FileStream et Codage

 StringBuilder sb = new StringBuilder(); 
     StreamReader sr = new StreamReader("XXX.shb", Encoding.ASCII); 
     BinaryReader br = new BinaryReader(sr.BaseStream); 
     string sLine; 
     string s = ""; 

     while (sr.EndOfStream == false) { 
      byte[] buffer = br.ReadBytes(1); 
      byte c = buffer[0]; 
      byte lb = (byte)((c & 0x0F) << 4), hb = (byte)((c & 0xF0) >> 4); 
      byte ascii = (byte)((lb) | (hb)); 

      s += Encoding.ASCII.GetString(new byte[] { ascii }); 
     } 
     sr.Close(); 

     return (sb); 

Si le fichier commence par 0xF2 0xF2 ..., je lis tout sauf la valeur attendue. Où est l'erreur? (c'est-à-dire 0xF6 0xF6).

En fait, ce code C faire le travail:

  ... 
while (fgets(line, 2048, bfd) != NULL) { 
    int cLen = strlen(xxx), lLen = strlen(line), i; 

    // Decode line 
    for (i = 0; i < lLen-1; i++) { 
     unsigned char c = (unsigned char)line[i]; 
     line[i] = ((c & 0xF0) >> 4) | ((c & 0x0F) << 4); 
    } 

    xxx = realloc(xxx , cLen + lLen + 2); 
    xxx = strcat(xxx , line); 
    xxx = strcat(xxx , "\n"); 
} 
fclose(bfd); 

Quel mal dans le code C#?

Répondre

2

Vous l'avez.

Le problème est la construction BinaryReader:

StreamReader sr = new StreamReader("XXX.shb", Encoding.ASCII); 
BinaryReader br = new BinaryReader(sr.BaseStream); 

Je pense que la construction d'un BinaryReader basé sur StreaReader qui caractères « traduire » provenant du fichier.

En utilisant ce code, fonctionne en fait bien:

FileInfo fi = new FileInfo("XXX.shb"); 
BinaryReader br = new BinaryReader(fi.OpenRead()); 

Je me demande s'il est possible de lire ce genre de données avec une ligne de lecteur de flux de texte par ligne, car les fins de ligne sont conservés pendant la phase « d'encodage » .

+0

fin de ligne n'a pas de sens quand on traite les fichiers comme des octets "stupides", je pense donc que vous n'avez pas besoin de prendre en charge la "lecture ligne" dans un BinaryReader. Si vous voulez encore "décoder" tout votre fichier, cela n'a pas beaucoup de sens de le faire ligne par ligne. – jishi

0

Je suppose que vous devez utiliser un BinaryReader et ReadBytes(), puis utilisez uniquement Encoding.ASCII.GetString() sur la bytesequence après avoir échangé les bits. Dans votre exemple, vous semblez lire le fichier comme ascii (ce qui signifie que vous convertissez des octets en code interne double octet .NET en le lisant en disant qu'il est ascii), puis le convertir en octets à nouveau, comme ascii -bytes.

Cela n'est pas nécessaire pour vous.

+0

Même avec BinaryReader n'a pas pu obtenir le bon résultat. :((Voir édition) – Luca