2011-01-05 27 views
2

Ich habe eine Datei, die in einem Text und einem Binärbild existiert, ich muss von 0 bis 30 Position den fraglichen Text lesen, und die Position auf 31 wäre das Bild im Binärformat. Welche Schritte muss ich befolgen, um mit diesem Problem fortzufahren?Wie lese ich eine Binärdatei in C#?

Zur Zeit versuche ich, es zu lesen FileStream verwenden, und dann ziehe ich das Filestream var einen BinaryReader wie unten dargestellt:

FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read) 
BinaryReader br = new BinaryReader(fs) 

Von dort vorwärts, ich bin verloren.


UPDATE

In Ordnung, so kann ich meine Datei jetzt lesen. Bis die Position 30 ist meine 30 Zeichenfolge, von Position 30 ist die Bit-Zeichenfolge, die eigentlich ein Bild ist. Ich frage mich, wie lese ich die Bytes von Position 30 und speichern Sie dann die Bilder! Hat jemand irgendwelche Ideen? ein Beispiel aus meiner Datei Folgen Sie einige ideia haben:

£ˆ‰¢@‰¢@¢–”…@•…¦@„£@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.-///%<<[email protected][K}@k{M÷]kðñôôô}ù~øòLKóôòÿg 

Beachten Sie, dass auch die @ @ @ my String ist und aus, dass das Bild ein Byte sein würde.

+0

Also, wie liest du die Datei an erster Stelle? – RvdK

+0

lese ich wie folgt: ich Filestream verwenden und dann ziehe ich das Filestream var einen Binary wie unten dargestellt: Ex: Filestream fs = new Filestream (filePath, FileMode.Open, FileAccess.Read)) BinaryReader br = neuer BinaryReader (fs) Von jetzt an bin ich verloren. – mcamara

+1

Für zukünftige Referenz ist es besser, Ihre ursprüngliche Frage zu bearbeiten, um weitere Erläuterungen hinzuzufügen. Sie erhalten den Vorteil einer viel besseren Formatierung, besonders wenn Sie versuchen, Code zu zeigen. –

Antwort

3

Erweitern Rogers Antwort ein wenig, mit etwas Code.

Eine Zeichenkette ist immer in einem bestimmten Format kodiert, und um sie zu lesen, müssen Sie diese Kodierung kennen (besonders wenn Sie einen binären Leser verwenden). In vielen Fällen ist es einfach ASCII und Sie können Encoding.ASCII.GetString verwenden, um es zu analysieren, wenn Sie unerwartete Ergebnisse (seltsame Zeichen usw.) erhalten und dann eine andere Kodierung versuchen.

Um das Bild zu parsen, müssen Sie einen Bildparser verwenden. .NET hat mehrere als Teil ihrer GUI-Namespaces. In dem folgenden Beispiel verwende ich das von System.Drawing (Windows Forms), aber ähnliche gibt es in WPF und es gibt viele Third-Party-Bibliotheken da draußen.

using (var reader = new BinaryReader(File.Open(someFile, FileMode.Open)) 
{ 
    // assuming your string is in plain ASCII encoding: 
    var myString = System.Text.Encoding.ASCII.GetString(reader.ReadBytes(30)); 
    // The rest of the bytes is image data, use an image library to process it 
    var myImage = System.Drawing.Image.FromStream(reader.BaseStream); 
} 

Jetzt hat MSDN ein caution about die Base in Verbindung mit Binary verwenden, aber ich im obigen Fall glauben, sollten Sie sicher sein, da Sie nicht mit dem Strom nach dem Bild verwendet wird. Aber halte Ausschau nach Problemen. Wenn fehlschlägt, können Sie immer die Bytes in eine neue byte[] lesen und einen neuen MemoryStream aus diesen Bytes erstellen.

EDIT:

Sie haben angegeben, in Ihrem Kommentar Zeichenfolge ist EBCDIC was leider bedeutet, dass Sie keine der eingebauten Codierungen, sie entschlüsseln können. Eine schnelle Google-Suche ergab eine post by Jon Skeet für eine EBCDIC .NET Encoding-Klasse, die Sie möglicherweise starten. Es wird Ihnen im Wesentlichen geben ebcdicEncoding.GetString(...);

+0

, wenn ich myString als Format verwenden Gebrüll: System.Text.Encoding.ASCII.GetString (reader.ReadBytes (30)); Die Prozedur gibt es mir zurück: ???? @ ?? @ ???? @ ??? @ ???? @@@@@@@@@ Aber meine Datei haben den folgenden Wortlaut: £ ‰ ¢ @ ‰ ¢ @ ¢ -“... @ • ... | @„£ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ – mcamara

+0

ich denke, dass ich die Zeichenfolge mit anderer Codierung erhalten habe! – mcamara

+0

Woher sollen wir wissen, welche Kodierung verwendet wird? Es gibt UTF8 und viele Gebietsschema-abhängige Kodierungen. – CodesInChaos

2

Sie können FileStream zum Öffnen und Lesen von der Datei verwenden. Wenn Sie die ersten 30 Bytes in einem Puffer lesen, können Sie das in eine Zeichenkette konvertieren, indem Sie "string Encoding.ASCII.GetString (byte [] buffer, int offset, int length)" verwenden.

+0

Entschuldigung, aber ich möchte die ersten 30 Bytes lesen, mit dem Befehl substring? – mcamara

+0

Warum? Die Methode über GetString() funktioniert gut. Wenn Sie vom BinaryReader in einen Puffer (Byte-Array) lesen, können Sie diesen Puffer verwenden, um die Zeichenfolge sowie die Bilddaten zu extrahieren. –

+0

@tomcamara: Teilstring liest nicht aus einer Datei, es extrahiert ein Stück einer Zeichenkette. Genau das tun, was Roger gesagt und es wird funktionieren :-) –

Verwandte Themen