Bytes einer Datei ab einer bestimmten Position einlesen – aber bitte vorne im Bytearray platzieren

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von -Franky-.

    Bytes einer Datei ab einer bestimmten Position einlesen – aber bitte vorne im Bytearray platzieren

    Hallo zusammen,

    meine Funktion soll in einer Datei den Codec finden. Hier als Beispiel
    H.264. Kann aber auch mal was anderes sein.
    Ich weiß, dass der Codec in einem sogenannten
    mdat-Block ist. mdat wird gefunden und die Nummer wird an die Funktion übergeben (n). Von dort an sollen ein paar wenige Zeichen gelesen werden – es reichen auf jeden Fall 75.

    Mein Problem ist: mdat muss nicht in den ersten 100 Bytes der Datei sein; ist nämlich auch bei 4400. Was macht natürlich FileStream.Read? Platziert die eingelesenen Bytes an Stelle 4400 im buffer, statt bei 0. Ich möchte später splitten anhand von - und /. Deswegen darf das nicht so lang sein.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub MP4_get_Codec2(n As Integer, FullPath As String)
    2. Dim buffer() As Byte = New Byte(8000) {}
    3. Using fs As New IO.FileStream(FullPath, IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.None)
    4. fs.Read(buffer, n, buffer.Length - n)
    5. End Using
    6. Dim str2 As String = System.Text.Encoding.ASCII.GetString(buffer, n, buffer.Length - n)
    7. Dim getrennt As String() = str2.Split({"-"c, "/"c})
    8. If getrennt.Length > 2 Then
    9. If getrennt(2) = "H.264" Then
    10. Codec2 = Codecs2.H_264
    11. End If
    12. End If
    13. End Sub


    Bilder
    • Screenshot 2022-08-11 195114.png

      12,23 kB, 1.022×88, 33 mal angesehen
    Hi

    FileStream.Read(Byte[], Int32, Int32)
    offset:
    The byte offset in array at which the read bytes will be placed.

    Erste Möglichkeit: Lese Deinen buffer komplett ein und kopiere dann per Array.Copy ab n x-Bytes in ein neues Array.

    Zweite Möglichkeit: Lese zu erst n-Bytes ein und danach nochmal x-Bytes.

    Oder einfach FileStream.Seek zu n und dann x-Bytes einlesen.

    -> ohne Einbindung von Libraries: Einbinden musst da nix. Nur ein paar APIs und COM-Interfaces. Neben dem Codec bekommst darüber auch andere Eigenschaften wie die Duration, Dimension uvm. ;)
    Mfg -Franky-

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

    @Bartosz Sieh Dir mal die FileStream.Seek-Methode an:
    docs.microsoft.com/de-de/dotne…estream.seek?view=net-6.0
    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!
    Top, ich danke euch.
    Lösung

    VB.NET-Quellcode

    1. Private Sub MP4_get_Codec2(n As Integer, FullPath As String)
    2. Dim buffer() As Byte = New Byte(76) {}
    3. Using fs As New IO.FileStream(FullPath, IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.None)
    4. Dim j As Integer = 0
    5. fs.Seek(n, IO.SeekOrigin.Begin)
    6. For i As Integer = n To n + 76 Step 1
    7. buffer(j) = CByte(fs.ReadByte())
    8. j += 1
    9. Next
    10. End Using
    11. Dim str2 As String = System.Text.Encoding.ASCII.GetString(buffer, 0, buffer.Length)
    12. Dim getrennt As String() = str2.Split({"-"c, "/"c})
    13. If getrennt.Length > 2 Then
    14. If getrennt(2) = "H.264" Then
    15. Codec2 = Codecs2.H_264
    16. End If
    17. Else
    18. Codec2 = Codecs2.unknown
    19. End If
    20. End Sub