Text in Binärdatei suchen Topic is solved

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

User avatar
Gucky_87
Posts: 375
Joined: 03 Jul 2014, 05:09

Text in Binärdatei suchen

13 Mar 2017, 06:49

Huhu zusammen,

ich möchte in einer binären Datei einen bestimmten Text (String) suchen, bekomme das aber nicht hin.
Wenn ich die Datei mit "Fileread" einlese, wird diese offenbar nicht vollständig gelesen, denn sonst
müsste ich mit

Code: Select all

FileRead, data, *c "D:\...Dateiname"
pos := InStr(data, "3Y8")
Erfolg haben, was aber nicht der Fall ist.
Der Text ist immer der selbe, denn es handelt sich nur um eine Versionsnummer, die jedoch nicht immer
an der selben Stelle steht. Der Text lautet "3Y8" und kommt nur ein einziges mal in der Datei vor.

Vielleicht gibt´s ja jemanden, der sowas schon mal gemacht hat?

Noch ein Hinweis:
Die zu durchsuchdenden Dateien sind max. 2 MB lang, also nicht übermäßig Speicher fressend.

Meine Suche hier im Forum blieb bislang ohne Ergebnis.

Grüße,

Gucky.
just me
Posts: 9407
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Text in Binärdatei suchen

13 Mar 2017, 10:48

Moin,

zum Einlesen von Binärdateien per FileRead solltest Du die Option *c benutzen. Sonst versucht AHK den eingelesenen Bereich abhängig von der Codierung der Datei und der Version (A32/U32/U64) in lesbaren Text zu konvertieren. Die Funktion InStr() taugt für Binädateien nicht, weil der übergebene Dateiinhalt beim ersten 'Nullzeichen' abgeschnitten wird (siehe Lesen von Binärdaten).

Ich weiß nicht, ob man mit RegExMatch() suchen kann, die Textcodierung innerhalb der Datei müsste dann aber wohl der AHK-Codierung entsprechen.

Bleibt noch die in der Hilfe angegebene Methode NumGet(). Auch dafür musst Du wissen, wie der Text innerhalb der Datei codiert ist (ANSI/Unicode). Dann kannst Du in einer Schleife das erste Zeichen des gesuchten Textes suchen und im Trefferfall versuchen, mit StrGet() einen Text in der Länge des Suchstrings einzulesen. Ist der gelesene Text mit dem Suchstring identisch, bist Du fertig. Weil sich eine Folge von 3 bzw. 6 Bytes (ANSI/Unicode) in einer 2 MB großen Datei in vielen Stellen verbergen kann, könnte es hilfreich sein, wenn Du den Suchbereich eingrenzen kannst.

Grüße,

just me
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Text in Binärdatei suchen

13 Mar 2017, 14:46

Es wäre halt wirklich wichtig zu wissen welche Zeichenenkodierung genau verwendet wird.
ANSI und der am meisten verwendete Unicode Standard UTF-8 sollten diese Zeichen gleich kodieren.
Anders wäre dies doch wenn UTF-16 oder sogar UTF-32 verwendet wurde:
Natürlich bietet es sich dann an hier dann auch ein FileObj zu verwenden:

Code: Select all

filePath := "C:\...."
cStr := "3Y8"
strEncoding := "UTF-8"

fileObj := fileOpen( filePath, "r" )
VarSetCapacity( pBin, StrPut( cStr, strEncoding ) * ( (strEncoding="UTF-16"||strEncoding="cp1200") ? 2 : 1 ), 0 )
searchBitLength := StrPut( cStr, &pBin, strLen( cStr ), strEncoding ) * ( (strEncoding="UTF-16"||strEncoding="cp1200") ? 2 : 1 )
Loop
{
	Offset := 0
	if ( fileObj.ReadUInt() = numGet( pBin, Offset, "UInt" ) )
	{
		Offset++
		if ( Offset = searchBitLength )
		{
			foundPosition := fileObj.pos - Offset
			break 
		}
	} else if ( offset )
		fileObj.pos -= ( Offset - 1 )
}Until fileObj.AtEOF

Msgbox Der String %cStr% wurde, in der Datei %filePath% an der Position %foundPosition% gefunden
( ungetestet )
Recommends AHK Studio
User avatar
Gucky_87
Posts: 375
Joined: 03 Jul 2014, 05:09

Re: Text in Binärdatei suchen

14 Mar 2017, 08:51

Tjaaa, das ist genau das Problem.
Ich kann nicht sagen, wie die Dateien kodiert sind. Sie werden von einem Datenerfassungsgerät
auf eine SD Karte geschrieben und dort liegen sie halt als "Binär" Dateien vor.
Mit einem Hex Editor angezeigt, sieht man, dass jede Menge "NUL", "ACK" und ähnliche Zeichen
drin sind, mehr aber leider nicht.

Lediglich der zu suchende Text ist (glücklicherweise) in lesbarer Form enthalten.

Ich werde Deinen Vorschlag mal ausprobieren. Wenn´s mir das bringt, was ich
möchte, soll mir der Rest relativ Wurst sein XD

EDIT:
@ nnnik:
Das klappt leider nicht. Weder mit UTF-8, noch ANSI, noch mit UTF-16.

@ justme:
Wenn ich Fileread mit der *c Erweiterung als binäre Datei lade, lädt er sie zwar,
wenn ich das aber dann z.B. mit msgbox %data% anzeigen will, kommt exakt 1 Zeichen,
das japanisch aussehen könnte (lacht), mehr nicht.

Ich habe mal eine Beispieldatei angehängt, sowie einen Screenshot, der Euch zeigt,
wo der Text im Hex Editor steht.

Das Ziel der Übung ist im Detail folgendes:
Ich habe eine Datei, worin ich den String (im Beispiel) "ER-A411" suche. Dieser ist mir
IMMER bekannt, kann aber, je nach Versionsnummer, an unterschiedlichen Positionen stehen.
Ziel ist es, die hinter dem Text angegebene Versionsnummer auszulesen, um eben genau
diese dem User anzuzeigen.

Das "3Y8" (oben im 1. Post) bezog sich auf ein anderes System, das aber nach gleichen
Maßstäben arbeitet. Da ich aber gerade an dem 411´er System arbeite, habe ich diese
als Beispiel hochgeladen.


Gucky.
Attachments
ER-A411.png
Screenshot
ER-A411.png (113.49 KiB) Viewed 14396 times
ALL.zip
Beispieldatei
(98.88 KiB) Downloaded 286 times
Last edited by Gucky_87 on 14 Mar 2017, 09:21, edited 1 time in total.
just me
Posts: 9407
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Text in Binärdatei suchen

14 Mar 2017, 09:12

Wenn im Hexeditor zwischen den einzelnen Zeichen Deines Suchstrings keine NUL Bytes zu erkennen sind, ist es höchtwahrscheinlich als ANSI (CP0) lesbar.
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Text in Binärdatei suchen

14 Mar 2017, 12:09

just me wrote:Wenn im Hexeditor zwischen den einzelnen Zeichen Deines Suchstrings keine NUL Bytes zu erkennen sind, ist es höchtwahrscheinlich als ANSI (CP0) lesbar.
Oder UTF-8.
Es sieht wohl so aus als hätte ich bei meinem Skript 2 Fehler gemacht.
Ich werde das ganze mal mit deiner Beispieldatei durchtesten.
Da es immer eine andere Stelle ist ist es wahrscheinlich, dass die Daten die vor der Nummer stehen auch unterschiedlich lang sind.
Wenn wir Glück haben finden wir entweder einen OffsetPointer oder ein Size member für die anderen Daten.
Wenn nicht dann wirst du dich auf die Suche beschränken müssen.

Code: Select all

SetBatchLines, -1
filePath := "ALL.SDA"
cStr := "ER-A411"
strEncoding := "UTF-8"


foundPosition := scanFileForString( filePath, cStr, strEncoding )
if ( foundPosition )
	Msgbox Der String "%cStr%" wurde, in der Datei "%filePath%", an der Position %foundPosition% gefunden.
else
	Msgbox Der String "%cStr%" wurde, in der Datei "%filePath%", nicht gefunden.

fFile := fileOpen( filePath, "r" )
fFile.Pos := foundPosition
Msgbox % "Der Text ab der Position " . foundPosition . " lautet: " . fFile.Read()

scanFileForString( filePath, searchString, stringEncoding = "UTF-8" )
{
	VarSetCapacity( pBin, StrPut( searchString, stringEncoding ) * ( ( stringEncoding = "UTF-16" || stringEncoding = "cp1200" ) ? 2 : 1 ), 0 )
	searchBinaryLength := StrPut( searchString, &pBin, strLen( searchString ), stringEncoding ) * ( ( stringEncoding = "UTF-16" || stringEncoding = "cp1200" ) ? 2 : 1 )
	return scanFileForBinary( filePath, pBin, searchBinaryLength )
}

scanFileForBinary( filePath, byref searchBinary, searchBinarylength )
{
	if !FileExist( filePath )
		return
	Offset := 0
	fileObj := fileOpen( filePath, "r" )
	Loop
	{	
		if ( fileObj.ReadUChar() = numGet( searchBinary, Offset, "UChar" ) )
		{
			Offset++
			if ( Offset = searchBinarylength )
				return foundPosition := fileObj.pos - Offset
		} else if ( offset )
			fileObj.pos -= ( Offset - 1 ), Offset := 0
	}Until fileObj.AtEOF
}
<< HIer der korrekte Code.
Recommends AHK Studio
just me
Posts: 9407
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Text in Binärdatei suchen

14 Mar 2017, 16:16

nnnik wrote:Oder UTF-8.
Was bei dem Suchstring wie "3Y8" oder "ER-A411" absolut keinen Unterschied bedeutet.

Ich würde meine Festplatte bzw. SSD auch nicht unbedingt mit so vielen unnützen Lesezugriffen quälen wollen.
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Text in Binärdatei suchen

14 Mar 2017, 19:20

Was natürlich über buffering Windows für uns übernimmt.
Recommends AHK Studio
just me
Posts: 9407
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Text in Binärdatei suchen

15 Mar 2017, 06:20

nnnik wrote:Was natürlich über buffering Windows für uns übernimmt.
Trau schau wem! ;)

Das sollte es auch tun:

Code: Select all

#NoEnv
SetBatchLines, -1
FilePath := "D:\All.SDA"
SearchStr := "ER-A411"
MsgBox, % FindInBinaryFile(FilePath, SearchStr)
ExitApp

FindInBinaryFile(FilePath, SearchStr) {
   FileGetSize, FileSize, %FilePath%
   FileRead, FileContent, *c %FilePath%
   Length := StrLen(SearchStr)
   FirstChar := Asc(SubStr(SearchStr, 1, 1))
   Offset := 0
   MaxOffset := FileSize - Length
   Found := 0
   While (Offset < MaxOffset) {
      If (NumGet(FileContent, Offset, "UChar") = FirstChar) && (StrGet(&FileContent + Offset, Length, "CP0") == SearchStr) {
         Found := Offset + 1
         Break
      }
      Offset++
   }
   Return Found
}
User avatar
Gucky_87
Posts: 375
Joined: 03 Jul 2014, 05:09

Re: Text in Binärdatei suchen

23 Mar 2017, 06:35

Hallöchen (hust) zusammen (schnief)...

Mich haben klitzekleine Lebewesen, davon aber offenbar eine Milliardenschaft
angegriffen und dahin gerafft (Hehe, das reimt sich sogar ^^).
Mich hat es voll umgehauen, daher konnte ich bis jetzt nicht rein schauen.
Erst einmal wirklich ganz dicken Dank dafür, dass Ihr Euch mit meinen Sorgen
beschäftigt /habt).

Ich werde das sobald wie möglich mit verschiedenen Dateien testen und Euch
das Ergebnis mitteilen.

Nochmals danke und mich verbeug,

Gucky.
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Text in Binärdatei suchen

23 Mar 2017, 07:45

Mir macht es Spaß mit just me zu kompetetieren. Zudem bringt es einem selbst unheimlich viel bei die Probleme von anderen zu lösen - da es Probleme sind über die man selber auch findet. Ich finde es macht auch viel aus in diesem Forum, dass wir dieses "rennen" haben. Ganz besonders wenn man als Student mit nicht so viel Erfahrung seinen eigenen code mit den von jemandem wie just me der Experte in software development ist vergleichen kann. In diesem speziellen Fall macht es keinen Unterschied. Jedoch ist just me's Code logisch betrachtet besser. Eingabe Ausgabe Verarbeitung enfach stoisch durchgezogen. Ich freue mich noch auf viel Zeit in diesem Forum.
Recommends AHK Studio
garry
Posts: 3720
Joined: 22 Dec 2013, 12:50

Re: Text in Binärdatei suchen

24 Mar 2017, 02:33

danke für den script
user Gucky_87 schrieb :
... -Ziel ist es, die hinter dem Text angegebene Versionsnummer auszulesen
ich habe jetzt die Position vom gesuchten Text , kann ich von hier den nachfolgenden Text anzeigen lassen ? ( z.B. die nächsten 30 Buchstaben )

Code: Select all

#NoEnv
SetBatchLines, -1
FilePath := "C:\Dokumente und Einstellungen\Garry\Desktop\UrlDownLoadToFile\wget.exe"
SearchStr := "This program"
aa:=FindInBinaryFile(FilePath, SearchStr)
Msgbox, Der String ="%Searchstr%" wurde in der Datei ="%filePath%" an der Position ="%aa%" gefunden .
ExitApp

FindInBinaryFile(FilePath, SearchStr) {
   FileGetSize, FileSize, %FilePath%
   FileRead, FileContent, *c %FilePath%
   Length := StrLen(SearchStr)
   FirstChar := Asc(SubStr(SearchStr, 1, 1))
   Offset := 0
   MaxOffset := FileSize - Length
   Found := 0
   While (Offset < MaxOffset) {
      If (NumGet(FileContent, Offset, "UChar") = FirstChar) && (StrGet(&FileContent + Offset, Length, "CP0") == SearchStr) {
         Found := Offset + 1
         Break
      }
      Offset++
   }
   Return Found
}
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Text in Binärdatei suchen  Topic is solved

24 Mar 2017, 04:16

Na klar. Wie in meinem Beispliel gezeigt:

Code: Select all

fFile := fileOpen( filePath, "r" )
fFile.Pos := foundPosition
Msgbox % "Der Text ab der Position " . foundPosition . " lautet: " . fFile.Read()
Wobei es sich dann aber wiederum eventuell lohnt das richtig positionierte FileObject zurückzugeben anstatt der einfachen Position.

Code: Select all

SetBatchLines, -1
filePath := "ALL.SDA"
cStr := "ER-A411"
strEncoding := "UTF-8"


fileObj := scanFileForString( filePath, cStr, strEncoding )
if isObject( fileObj )
{
	Msgbox % "Der String """ . cStr . """ wurde, in der Datei """ . filePath . """, an der Position " . fileObj.Pos . " gefunden."
	Msgbox % "Der Text ab der Position " . foundPosition . " lautet: " . fileObj.Read( 30 ) ;liest die nächsten 30 Zeichen ein
}
else
	Msgbox Der String "%cStr%" wurde, in der Datei "%filePath%", nicht gefunden.



scanFileForString( filePath, searchString, stringEncoding = "UTF-8" )
{
	VarSetCapacity( pBin, StrPut( searchString, stringEncoding ) * ( ( stringEncoding = "UTF-16" || stringEncoding = "cp1200" ) ? 2 : 1 ), 0 )
	searchBinaryLength := StrPut( searchString, &pBin, strLen( searchString ), stringEncoding ) * ( ( stringEncoding = "UTF-16" || stringEncoding = "cp1200" ) ? 2 : 1 )
	return scanFileForBinary( filePath, pBin, searchBinaryLength, stringEncoding )
}

scanFileForBinary( filePath, byref searchBinary, searchBinarylength, fileEncoding = "UTF-8" )
{
	if !FileExist( filePath )
		return
	Offset := 0
	fileObj := fileOpen( filePath, "r" )
	Loop
	{	
		if ( fileObj.ReadUChar() = numGet( searchBinary, Offset, "UChar" ) )
		{
			Offset++
			if ( Offset = searchBinarylength )
			{
				fileObj.pos -= Offset
				return fileObj
			}
		} else if ( offset )
			fileObj.pos -= ( Offset - 1 ), Offset := 0
	}Until fileObj.AtEOF
}
Recommends AHK Studio
just me
Posts: 9407
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Text in Binärdatei suchen

24 Mar 2017, 05:55

Moin garry,

danke für den Hinweis. Ich habe das übersehen. Ich gehe mal davon aus, dass die gesuchte Versionsnummer in diesem Fall die V1.3333 ist. Die ist hinter ER-411/A421V abgetrennt durch ein NULL Byte als eigener String abgelegt.

Die von der Funktion zurückgelieferte Postion ist für diesen Fall recht nutzlos. Sie sagt ja nur aus, wo der String ER-411 gefunden wurde. Der eingelesene Dateiinhalt steht aber nicht mehr zur Verfügung. Ich würde die Funktion deshalb 'spezialisieren':

Code: Select all

#NoEnv
SetBatchLines, -1
FilePath := "D:\ALL.SDA"
TypeStr := "ER-A411"
If (Version := Find_SDA_Version(FilePath, TypeStr))
   MsgBox, 0, Version, Die Datei %FilePath% des Typs %TypeStr% hat die Version %Version%!
Else
   MsgBox, 0, Version, Die Version der Datei %FilePath% konnte nicht ermittelt werden.
ExitApp

Find_SDA_Version(FilePath, TypeStr, Encoding := "CP0") {
   FileGetSize, FileSize, %FilePath%
   FileRead, FileContent, *c %FilePath%
   Length := StrLen(TypeStr)
   FirstChar := Asc(SubStr(TypeStr, 1, 1))
   Offset := 0
   MaxOffset := FileSize - Length
   Version := ""
   While (Offset < MaxOffset) {
      If (NumGet(FileContent, Offset, "UChar") = FirstChar) && (StrGet(&FileContent + Offset, Length, Encoding) == TypeStr) {
         While (NumGet(FileContent, Offset, "UChar") <> 0)
            Offset++
         Found := Trim(StrGet(&FileContent + Offset + 1, Encoding))
         Break
      }
      Offset++
   }
   VarSetCapacity(FileContent, 0)
   Return Found
}
In leicht abgewandelter Form kann man das auch nutzen, um einen String in einer vorgegebenen Länge ab der Trefferposition zurückzugeben. Wenn man allerdings anschließend mit der Datei noch mehr anstellen will, wäre eine File Object Variante besser.
User avatar
Gucky_87
Posts: 375
Joined: 03 Jul 2014, 05:09

Re: Text in Binärdatei suchen

24 Mar 2017, 10:15

So, ich hab das ganze nun getestet und es klapp(er)t super!

@ just me: Mit der 1.33333 liegst Du völlig richtig. Genau DIESE Info möchte ich letztenendes aus den Dateien auslesen.

Ich habe zur Zeit die Routine von nnnik, die er am 14.3. postete, im Einsatz, da die Routine von just me (FindInBinaryFile(FilePath, SearchStr)) aus dem darauf folgenden Post mir immer "0" lieferte.

Ich werde aber auch Eure nachfolgenden Vorschläge und Änderungen noch testen und Euch Rückmeldung geben.
Was ich Euch aber noch als Info geben kann (gestern erst herausgefunden, da bisher schlicht übersehen):
Die Angabe der Versionsnummer ist IMMER (auch bei verschiedenen Gerätetyen (Es gibt nicht nur ER-A411´ er) identisch und beträgt exakt 20 Bytes.
Ich habe das mit ca. 100 unterschiedlichen Dateien ausprobiert und als festen Offset + 20 eingestellt und das klappt immer bisher.
Auch macht es keinen Unterschied, ob ich "UTF-8" oder etwas anderes vorgebe. Da es Text ist, wird es offenbar immer gefunden.


Mehr habe ich übrigens mit der Datei nicht vor.
Der Sinn des ganzen ist folgendes:
Die Geräte haben eine Firmware (nämlich die gesuchte).
Ich kann vom User programmierten Daten per SD Karte oder PC von Gerät A nach B
übertragen, ABER das geht NUR bei IDENTISCHEN Firmware Versionen!
Ein Versionsunterschied von 0.01 reicht aus, um echt merkwürdige Reaktionen der
Geräte zu erzeugen, wenn ich Userdaten aus einer anderen Firmware einspiele.

Daher gebe ich die Versionsnummern in einer Tabelle aus, damit ich auf einen Blick
sehe: Ahhh ja, nee besser nicht dies hier einspielen, sondern das. Gibt sonst Krusch.

Die Geräte merken es nämlich nicht, ob ich richtige Daten einspiele.
Sie melden sich nur hinterher - oder eben auch nicht (mehr). Hehe.


Grüße,

Gucky.
just me
Posts: 9407
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Text in Binärdatei suchen

25 Mar 2017, 02:16

Moin,
..., da die Routine von just me (FindInBinaryFile(FilePath, SearchStr)) aus dem darauf folgenden Post mir immer "0" lieferte.
Das ist merkwürdig. Ich habe das mit der von Dir hochgeladenen Datei getestet und bekomme (immer noch) 18615 zurück.
Die Angabe der Versionsnummer ist IMMER (auch bei verschiedenen Gerätetyen (Es gibt nicht nur ER-A411´ er) identisch und beträgt exakt 20 Bytes.
Dem widerspricht Dein Hex-Dump (beim Programmieren bin ich pedantisch). Danach sieht das so aus:

Code: Select all

00 45 52 2D 41 34 31 31 2F 41 34 32 31 56 20 00 20 20 20 20 56 31 2E 33 33 33 33 20 00
00>E  R  -  A  4  1  1  /  A  4  2  1  V    <00>            V  1  .  3  3  3  3    <00
  >             Typbezeichnung              <  >              Version              <
Damit ist die Typbezeichnung exakt 14 Zeichen lang, dann folgt das abschließende NULL Byte und dann die Versionsnummer mit 12 Zeichen (4 Leerzeichen am Anfang und eins am Ende). Mit einem Offset von 20 überhüpfst Du wahrscheinlich die führenden Leerzeichen. Das kann problematisch werden, falls sich deren Anzahl mal ändern sollte.

Grüße,
just me
garry
Posts: 3720
Joined: 22 Dec 2013, 12:50

Re: Text in Binärdatei suchen

26 Mar 2017, 04:59

@just me und nnik
vielen Dank für eure scripts und Lösungen , kann selber gar nicht nachvollziehen ...
ich verstehe lediglich die ahk - Befehle ( if .. then .. goto .. etc . )

habe lediglich ein Versuch gemacht mit wget.exe ( finde string-position und denn zeige von hieraus den nachfolgenden Text an mit der Länge xx )

hier Beispiel von nnik

Code: Select all

SetBatchLines, -1
strEncoding := "UTF-8"

FilePath := "C:\Dokumente und Einstellungen\Garry\Desktop\UrlDownLoadToFile\wget.exe"
ifnotexist,%filepath%
  {
  msgbox,FILE NOT exists=`n%filepath%
  exitapp
  }
cStr := "This program"
aac:="This program cannot be run in DOS mode."
stringlen,xx,aac

fileObj := scanFileForString( filePath, cStr, strEncoding )
if isObject( fileObj )
  {
  aaf:="Der String """ . cStr . """ wurde, in der Datei """ . filePath . """, an der Position " . fileObj.Pos . " gefunden."
  aag:="Der Text ab der Position " . fileObj.Pos  . " lautet:`n" . fileObj.Read(xx)
  msgbox,%aaf%`n%aag%
  }
else
  Msgbox Der String "%cStr%" wurde, in der Datei "%filePath%", nicht gefunden.
return


scanFileForString( filePath, searchString, stringEncoding = "UTF-8" )
{
	VarSetCapacity( pBin, StrPut( searchString, stringEncoding ) * ( ( stringEncoding = "UTF-16" || stringEncoding = "cp1200" ) ? 2 : 1 ), 0 )
	searchBinaryLength := StrPut( searchString, &pBin, strLen( searchString ), stringEncoding ) * ( ( stringEncoding = "UTF-16" || stringEncoding = "cp1200" ) ? 2 : 1 )
	return scanFileForBinary( filePath, pBin, searchBinaryLength, stringEncoding )
}

scanFileForBinary( filePath, byref searchBinary, searchBinarylength, fileEncoding = "UTF-8" )
{
	if !FileExist( filePath )
		return
	Offset := 0
	fileObj := fileOpen( filePath, "r" )
	Loop
	{
		if ( fileObj.ReadUChar() = numGet( searchBinary, Offset, "UChar" ) )
		{
			Offset++
			if ( Offset = searchBinarylength )
			{
				fileObj.pos -= Offset
				return fileObj
			}
		} else if ( offset )
			fileObj.pos -= ( Offset - 1 ), Offset := 0
	}Until fileObj.AtEOF
}
return
User avatar
Gucky_87
Posts: 375
Joined: 03 Jul 2014, 05:09

Re: Text in Binärdatei suchen

16 Oct 2017, 05:36

Huhu, ich muss diesen alten Post nochmal hervorkramen.

Flgender Code:

Code: Select all

scanFileForString( filePath, searchString, stringEncoding = "UTF-8" )
{
    VarSetCapacity( pBin, StrPut( searchString, stringEncoding ) * ( ( stringEncoding = "UTF-16" || stringEncoding = "cp1200" ) ? 2 : 1 ), 0 )
    searchBinaryLength := StrPut( searchString, &pBin, strLen( searchString ), stringEncoding ) * ( ( stringEncoding = "UTF-16" || stringEncoding = "cp1200" ) ? 2 : 1 )
    return scanFileForBinary( filePath, pBin, searchBinaryLength )
}

scanFileForBinary( filePath, byref searchBinary, searchBinarylength )
{
    if !FileExist( filePath )
        return -1

    Offset := 0
    fileObj := fileOpen( filePath, "r" )
    Loop
    {	
        if ( fileObj.ReadUChar() = numGet( searchBinary, Offset, "UChar" ) )
        {
            Offset++
            if ( Offset = searchBinarylength )
            {
                foundPosition := fileObj.pos - Offset
                fileObj.Close()   ; <<<<<< Datei schließen
                return %foundPosition%
            }
        }
        else if ( offset )
            fileObj.pos -= ( Offset - 1 ), Offset := 0
    }
    Until fileObj.AtEOF
    fileObj.Close()    ; <<<<<< Datei schließen
}
Die beiden Zeilen mit dem Kommentar " ; <<<<<< Datei schließen" habe ich eingefügt, da mein Programm mir nach der Suche meldet, dass die entsprechende Datei geöffnet sei.

Trotz der Close Anweisungen bleibt dieser Fehler jedoch bestehen.

Wie kann ich die geöffnete(n) Datei(en) 100%ig schließen?


Dank Euch im Voraus,

Gucky.

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 28 guests