Die ersten vier Bytes aus einer Datei lesen

  • VB.NET

Es gibt 80 Antworten in diesem Thema. Der letzte Beitrag () ist von nikeee13.

    Die ersten vier Bytes aus einer Datei lesen

    Hallo,

    ich möchte gern die ersten vier Bytes einer Datei auslesen. In diesen Bytes können beliebige Hex Zeichen stehen (also auch nicht druckbare) und die dürfen nicht verändert werden.

    Mit ReadAllText dauert das zu lange.

    Mit dem Stream Reader kriege ich einzelne ZEILEN ... aber die Datei enthält möglicherweise gar kein vbLf ...

    Wie kann man das Lesen auf die ersten vier Bytes beschränken?


    LG
    Peter
    einfach Bytes kann man auch direkt aussm FileStream lesen - dazu braucht man garkein Reader.


    nochmal zur Klarstellung:
    Das Hexadezimale Darstellungs-Format ist eine der 4 üblichen Konvention für Strings, wie sie Ziffern darstellen:
    1. binär: Es gibt nur die Ziffer-Zeichen '0' und '1'
    2. dezimal: Ziffer-Zeichen sind "0123456789"
    3. oktal: "01234567"
    4. hexadezimal: "0123456789ABCDEF"
    Noch-einmal: Es handelt sich um die Darstellung von Zahlen, die Zahlen selbst geht das überhaupt nichts an.

    Beipiel: angenommen die Zahl 25.
    Dassis 25, und dassis immer 25 - egal, wie ichs hinschreib: hex: F9, dezimal: 25, oktal: 31, binär: 11001

    Also was meinst du mit Hex-Zeichen auslesen? Wenn du Ziffern der hexadezimalen Schreibweise meinst, dann willst du also keine Bytes lesen, sondern Chars, denn Ziffern sind Chars (wie übrigens Buchstaben auch).
    Das geht nicht direkt mittm Stream, sondern das geht entweder mittm BinaryReader (einzelne) oder mittm StreamReader (mehrere Chars auf einen Rutsch).

    Such dir die Klassen im ObjectBrowser, wenn du fragen dazu hast, poste Screenshot von der Ansicht im OB.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Erst mal ganz herzlichen Dank für eure Antworten!

    Das mit dem "binary Reader" hab ich auch schon gelesen ... und da bin ich ein bissl unsicher, ob das für mich das Richtige ist. Die Frage ist, wie die Daten angeliefert werden. Bei binären Daten spielt immer die Reihenfolge der Bytes eine Rolle ... kommen zuerst die low order Bytes und dann die high order Bytes oder umgekehrt.

    Ich will ganz einfach abprüfen, ob die ersten vier Byte einer Datei den Inhalt

    X'CC EE DD FF'

    enthalten. Das ist eine Signatur, die ich erkennen möchte. Ich hab das noch nicht ausprobiert aber ich befürchte, dass der binary Reader die Reihenfolge irgendwie verändern wird. Und ich möchte schon absolut sicher sein, dass meine Prüfung auch stimmt.

    @ErfinderdesRades

    Dein Hinweis klingt sehr vielversprechend. Ich hab mir daraufhin dein Video angeschaut. Erst mal Respekt: deine didaktischen Fähigkeiten sind beachtlich! Du erklärst sehr ruhig und überzeugend.

    Aber da geht es doch irgendwie um das Kopieren von xml Strings ... und wie ich jetzt aus meinen Dateien die ersten vier Bytes auslese, das weiß ich nun leider immer noch nicht. Na, vielleicht bin ich ganz einfach ein hartnäckiger Dummkopf! :P

    Also ich wäre schon sehr dankbar über ein kleines Code Beispiel, wie man den Beginn eines Files "AS IS" auslesen kann!

    LG
    Peter
    Wenn du die Bytes einzeln mit ReadByte ausliest, dann wird da auch nix durcheinander geraten. Das kann eigentlich nur Passieren, wenn du Chars mit einem bestimmten Encoding ausliest, aber solange du bei den rohen Binärdaten bleibst wird da nichts geändert.

    Peter329 schrieb:

    Also ich wäre schon sehr dankbar über ein kleines Code Beispiel
    Nixda - Faulpelz!

    einfach mal machen, wassich vorschlage:

    ErfinderDesRades schrieb:

    Such dir die Klassen im ObjectBrowser, wenn du fragen dazu hast, poste Screenshot von der Ansicht im OB.
    Da kann man konkret am Screenshot aufzeigen, wie BinaryReader oder StreamReader (letzterer is hier geeigneter) zu verwenden ist.
    Ok, also ich hab jetzt versucht mit der MSDN Doku klar zu kommen ...

    VB.NET-Quellcode

    1. Dim binReader As New BinaryReader("c:\mydir\myfile.txt")
    2. ' Set the stream position to the beginning of the stream.
    3. binReader.BaseStream.Position = 0
    4. ' Read the data.
    5. Dim dataArray() As Byte = binReader.ReadBytes(4)


    Das klappt aber nicht, weil das Füllen von binReader über einen Objekt-Namen (c:\mydir\myfile.txt) nicht funktioniert. (Der Wert vom Typ String kann nicht in System.IO.Stream konvertiert werden).

    Irgendwas hab ich da falsch verstanden!

    LG
    Peter
    Ich bitte um Nachsicht! Aber was ist der ObjectBrowser und wo finde ich seine Klassen?

    Das mit der Fehlermeldung sagt mir schon was ... es wird kein Pfad erwartet, sondern ein FileStream. Also muss da wohl vorher ein File.Open erfolgen ... hmm .. mal sehen, ob ich das hinkriege:

    VB.NET-Quellcode

    1. FileOpen(1, "c:\mydir\myfile.txt", OpenMode.Input)


    Und wo kriege ich jetzt den benötigten Stream her?

    Ich weiß, ich bin nervig ...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Peter329“ ()

    Bitte genau lesen, es ist File . Open (den Punkt beachten), die objektorientierte Version für .Net, das was du da hast ist FileOpen, das nichtobjektorientierte Überbleibsel aus VB6, welches man nicht mehr verwenden sollte.
    Die richtige Funktion gibt dir den FileStream zurück.
    also ... jetzt habe ich das so in etwa hinbekommen:

    VB.NET-Quellcode

    1. Dim fs As FileStream
    2. fs = File.Open(strObject, FileMode.Open, FileAccess.Read)
    3. Dim binReader As New BinaryReader(fs)
    4. ' Set the stream position to the beginning of the stream.
    5. binReader.BaseStream.Position = 0
    6. ' Read the data.
    7. Dim dataArray() As Byte = binReader.ReadBytes(4)
    8. fs.Close()


    Danke für die vielen Ratschläge ... ich hoffe, dass mein Coding eure Billigung findet! *g*
    Sieht gut aus.
    Allerdings ist Zeile 6 unnötig, da die Position im Stream zu Beginn schon 0 ist. Außerdem kannst du einen Using-Block für den FileStream und für den BinearyReader verwenden, das ist sauberer. Und wenn du nur lesend auf die Datei zugreifen willst, dann kannst du statt Open auch OpenRead verwenden, dann brauchst du nicht die ganzen Argumente angeben.
    Du könntest die BinaryReader-Klasse auch so instanzieren:

    VB.NET-Quellcode

    1. Dim bR As New BinaryReader(New FileStream("c:\1.exe", FileMode.Open, FileAccess.Read))


    Nicht unbedingt kürzer, aber die FileStream-Klasse übernimmt direkt im Konstruktor die Argumente, die Du bei File.Open() angibst.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Guten Morgen,

    Erst mal ein herzliches Dankeschön an alle Ratgeber!

    Ja, das Coding funktioniert ... und ich werde natürlich die vorgeschlagenenen Verbesserungen (OpenRead) einbauen und die Zeile mit Positionierung weglassen.

    Ich muss dann noch sehen, wie ich die vier Bytes zu einem String zusammenbaue. Aber das sollte ich hinbekommen.

    @ErfinderDesRades

    ne, ich bin nicht lernresistent! Ich gehe nur um 10 Uhr schlafen, weil ich am nächsten Tag wieder früh aufstehen muss und den ganzen Tag beruflich unterwegs bin. Heute Abend werde ich mich dann mit dem BrowserObject beschäftigen. Ich bin nämlich - ganz im Gegenteil zu deiner Vermutung - sehr lernbegierig! Es hätte mir halt die Sache erleichtert, wenn ich nicht nur einen Hinweis auf ein längeres Video kriege, bei dem es erst mal um ganz andere Dinge geht. Aber ich werde mich damit beschäftigen ... und dann frage ich nach, hehehe!

    Ich wünsch euch einen schönen Tag!

    LG
    Peter

    Peter329 schrieb:

    wie ich die vier Bytes zu einem String zusammenbaue.
    Probier es mal so:

    VB.NET-Quellcode

    1. Dim by() As Byte = {33, 34, 35, 36}
    2. Dim txt = System.Text.Encoding.Default.GetString(by)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!