In Binärdatei suchen und Teile ausschneiden
Hallo,
vielleicht kann mir jemand helfen.. Ich möchte mit vb.net in einer Binärdatei nach dem Vorkommen von drei Zeichen suchen und den Bereich dazwischen ausschneiden und als eine neue Datei abspeichern. Hat jemand ne Idee/Snippet wie ich an die Sache rangehen könnte?
Gruß Haegar
vielleicht kann mir jemand helfen.. Ich möchte mit vb.net in einer Binärdatei nach dem Vorkommen von drei Zeichen suchen und den Bereich dazwischen ausschneiden und als eine neue Datei abspeichern. Hat jemand ne Idee/Snippet wie ich an die Sache rangehen könnte?
Gruß Haegar
Please also mark the comments that contributed to the solution of the article
Content-Key: 290110
Url: https://administrator.de/contentid/290110
Printed on: April 24, 2024 at 00:04 o'clock
4 Comments
Latest comment
![Mitglied: 122990 Mitglied: 122990](/images/members/profile_male_64x64.png)
z.B. so ...
Gruß grexit
Imports System.IO
Imports System.Text
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
'Datei welche druchsucht wird
Const FILEIN = "C:\ordner\binary.exe"
'Datei in welche der Ausschnitt geschrieben wird
Const FILEOUT = "C:\ordner\binary_cut.exe"
'Suchstring
Const SEARCHSTRING = "DOS"
'Suche Offset des Strings im 'ASCII' Modus
Dim offset As Long = FindOffset(FILEIN, SEARCHSTRING)
Try
'Wurde String gefunden
If offset > -1 Then
'Lösche Ausgabedatei wenn vorhanden
If File.Exists(FILEOUT) Then Kill(FILEOUT)
'Anzahl Bytes in einen FileStream einlesen
Dim block(offset) As Byte
Using fIn As FileStream = New FileStream(FILEIN, FileMode.Open)
fIn.Read(block, 0, offset)
fIn.Close()
End Using
'Auschnitt Bytes in neue Datei schreiben
Using fOut As FileStream = New FileStream(FILEOUT, FileMode.CreateNew)
fOut.Write(block, 0, offset)
fOut.Close()
End Using
End If
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
Public Function FindOffset(filePath As String, strPattern As String) As Long
Try
Dim pattern() As Byte = Encoding.ASCII.GetBytes(strPattern)
If Not File.Exists(filePath) Then
Return -1
End If
Dim fb() As Byte = File.ReadAllBytes(filePath)
For i = 0 To fb.Length - 1
Dim found As Boolean = True
For j = 0 To pattern.Length - 1
If fb(i + j) <> pattern(j) Then
found = False
Exit For
End If
Next
If found Then
Return i
End If
Next
Return -1
Catch ex As Exception
Return -1
End Try
End Function
End Class
Gruß grexit
![Mitglied: 122990 Mitglied: 122990](/images/members/profile_male_64x64.png)
der String den ich jeweil suche ist eine binäre Zeichenfolge beispielsweise für 0x05h kann ich kein Ascii-Zeichen angeben, oder?
Klar geht das wußte halt nicht wie die Daten vorliegen, im Skript siehst du ja das die ASCII Strings in ein Byte-Array umgewandelt werden, das lässt sich natürlich alles anpassen. Im folgenden Beispiel gibst du die HEX-Werte als Array an {&H5,&H44} usw.Folgendes Skript sucht also nun zuerst vom Anfang der Datei aus nach SEARCHBYTES1, wird dieser gefunden wird von diesem Offset aus nach SEARCHBYTES2 gesucht. Wenn dieser ebenfalls gefunden wird. Werden die Offsets voneinander abgezogen, womit wir die Länge des Blocks kennen. Diesen schreiben wird nun in die Zieldatei, feddich.
Mit ein bißchen nachdenken hätte man sich das auch selbst erarbeiten können wenn man hier schon Code zum Nulltarif geliefert bekommt
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
'Datei welche druchsucht wird
Const FILEIN = "C:\ordner\binary.exe"
'Datei in welche der Ausschnitt geschrieben wird
Const FILEOUT = "C:\ordner\binary_cut.exe"
'Suchstrings
Dim SEARCHBYTES1() As Byte = {&H44, &H4F, &H53}
Dim SEARCHBYTES2() As Byte = {&H50, &H45}
Dim offset1 As Long, offset2 As Long
'Suche ersten Offset des Sucharrays
offset1 = FindOffset(FILEIN, SEARCHBYTES1)
If offset1 > -1 Then
' Suche den zweiten Offset des zweiten Sucharrays
offset2 = FindOffset(FILEIN, SEARCHBYTES2, offset1 + SEARCHBYTES1.Length)
Else
MsgBox("Sucharray 1 wurde nicht gefunden", vbExclamation)
Exit Sub
End If
Try
'Wurde String gefunden
If offset1 > -1 And offset2 > -1 Then
Dim blockLength As Long = offset2 - offset1
'Lösche Ausgabedatei wenn vorhanden
If File.Exists(FILEOUT) Then Kill(FILEOUT)
'Anzahl Bytes in einen FileStream einlesen
Dim block(blockLength - 1) As Byte
Using fIn As FileStream = New FileStream(FILEIN, FileMode.Open)
fIn.Seek(offset1, 0)
fIn.Read(block, 0, blockLength)
fIn.Close()
End Using
'Auschnitt Bytes in neue Datei schreiben
Using fOut As FileStream = New FileStream(FILEOUT, FileMode.CreateNew)
fOut.Write(block, 0, block.Length)
fOut.Close()
End Using
Else
MsgBox("Sucharray 2 wurde nicht gefunden", vbExclamation)
Exit Sub
End If
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
Public Function FindOffset(filePath As String, arrPattern() As Byte, Optional startOffset As Long = 0) As Long
Try
If Not File.Exists(filePath) Then
Return -1
End If
Dim fb() As Byte = File.ReadAllBytes(filePath)
For i = startOffset To fb.Length - 1
Dim found As Boolean = True
For j = 0 To arrPattern.Length - 1
If fb(i + j) <> arrPattern(j) Then
found = False
Exit For
End If
Next
If found Then
Return i
End If
Next
Return -1
Catch ex As Exception
MsgBox(ex.Message)
Return -1
End Try
End Function
End Class
Gruß und schönes zweites Adventswochenende
grexit
![Mitglied: 122990 Mitglied: 122990](/images/members/profile_male_64x64.png)
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen nicht vergessen.