2011-06-27 2 views
6

J'ai ce fichier texte qui contient différents champs. Certains champs peuvent contenir des données binaires. J'ai besoin d'obtenir toutes les données dans le fichier mais en ce moment en utilisant StreamReader alors il ne lira pas le bloc de données binaires et les données qui viennent après cela. Quelle serait la meilleure solution pour résoudre ce problème?StreamReader et les données binaires

Exemple:

field1|field2|some binary data here|field3 

droit i maintenant lu dans le fichier comme ceci:

public static string _fileToBuffer(string Filename) 
{ 
    if (!File.Exists(Filename)) throw new ArgumentNullException(Filename, "Template file does not exist"); 

    StreamReader reader = new StreamReader(Filename, Encoding.Default, true); 
    string fileBuffer = reader.ReadToEnd(); 
    reader.Close(); 

    return fileBuffer; 
} 

EDIT: Je connais les positions de début et de fin des champs binaires.

Répondre

7

StreamReader n'a pas été conçu pour les données binaires. Il est conçu pour texte données, ce qui explique pourquoi il s'étend TextReader. Pour lire des données binaires, vous devez utiliser un Stream, et ne pas essayer de mettre les résultats dans une chaîne (qui est, encore une fois, pour les données de texte).

En général, c'est une mauvaise idée de mélanger des données binaires et des données de texte dans un fichier comme celui-ci - que se passe-t-il si les données binaires comprennent le | symbole par exemple? Vous pouvez inclure les données binaires sous une forme codée sous forme de texte, comme une variante base64 qui évite |.

+0

Je n'ai aucun contrôle sur la source de données donc j'ai juste à faire avec ça .. – hs2d

+0

@ hs2d: Alors qu'est-ce qui se passe * si les données binaires incluent la représentation ASCII (ou quel que soit le codage utilisé) pour '|'? Y a-t-il quelque chose dans les deux premiers champs qui vous indique la longueur attendue? –

+0

il n'y a rien qui me dit la longueur attendue. Regardez mon autre question. Im en utilisant le modèle pour obtenir les séparateurs de champ ce qui marque la fin d'un champ: [link] (http://stackoverflow.com/questions/6479505/c-template-parsing-and-matching-with-text-file) – hs2d

9

utilisation BinaryReader

+0

Et BinaryWriter pour écrire le fichier dans un format binaire raisonnable. – Guillaume

+0

Quand j'utilise BinaryReader alors il obtient tous les champs en binaire, alors où devrais-je aller à partir de là pour récupérer les champs qui ne sont pas des données binaires en tant que chaînes? – hs2d

+0

@ hs2d StringBuilder + BinaryReader.ReadChar mais si vous pouvez modifier le fichier source, utilisez ReadString. – Guillaume