Binärdaten suchen [Erledigt]
Moderator: Moderatoren
- Jan
- Marvin
- Beiträge: 14662
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Binärdaten suchen [Erledigt]
Hallo,
ich habe eine FOXCDX mit einem V-Feld (binäres Memofeld). Da speichere ich Bilder drin, meist als jpg, aber auch als bmp, teilweise auch mal pdf. Da ich sicherstellen möchte, das jedes Bild nur 1x darin gespeichert wird schaue ich vor jedem Speichern nach, ob das schon existiert. Aber egal ob ich das mit einem Vergleich Feldinhalt - Variableninhalt in einer Do-While-Schleife mache, oder per DbLocate() - die vorhandenen Bilder werden niemals gefunden.
Liegt das daran, daß das Binärdaten sind?
Aber egal warum - wie kann ich die Bilder finden?
Jan
ich habe eine FOXCDX mit einem V-Feld (binäres Memofeld). Da speichere ich Bilder drin, meist als jpg, aber auch als bmp, teilweise auch mal pdf. Da ich sicherstellen möchte, das jedes Bild nur 1x darin gespeichert wird schaue ich vor jedem Speichern nach, ob das schon existiert. Aber egal ob ich das mit einem Vergleich Feldinhalt - Variableninhalt in einer Do-While-Schleife mache, oder per DbLocate() - die vorhandenen Bilder werden niemals gefunden.
Liegt das daran, daß das Binärdaten sind?
Aber egal warum - wie kann ich die Bilder finden?
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- Martin Altmann
- Foren-Administrator
- Beiträge: 16586
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 116 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Re: Binärdaten suchen
Moin Jan,
es gibt eigentlich nur eine sinnvolle Methode:
Ermittele vor dem Ablegen einer jeden Binärdatei in dem Memofeld ihre Quersumme (als Datei im Dateisystem!!!) und speichere diese in einem gesonderten Feld. Dann kannst Du zum Suchen, ob der Eintrag schon vorhanden ist, nach der Quersumme suchen.
Dir muss aber klar sein, dass optisch identische Bilder unterschiedliche Quersummen haben können (unterschiedliche Helligkeit/Schärfe/eines ist leicht beschnitten/...)
Viele Grüße,
Martin
es gibt eigentlich nur eine sinnvolle Methode:
Ermittele vor dem Ablegen einer jeden Binärdatei in dem Memofeld ihre Quersumme (als Datei im Dateisystem!!!) und speichere diese in einem gesonderten Feld. Dann kannst Du zum Suchen, ob der Eintrag schon vorhanden ist, nach der Quersumme suchen.
Dir muss aber klar sein, dass optisch identische Bilder unterschiedliche Quersummen haben können (unterschiedliche Helligkeit/Schärfe/eines ist leicht beschnitten/...)
Viele Grüße,
Martin
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/
Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Binärdaten suchen
was nicht geht istMartin Altmann hat geschrieben:es gibt eigentlich nur eine sinnvolle Methode:
Code: Alles auswählen
IF ::oBMP1 = ::oBMP2
Msgbox("::oBMP1 = ::oBMP2")
ENDIF
oder
IF ::oBild1:Caption = ::oBild2:Caption
Msgbox("::oBild1 = ::oBild2")
ENDIF
was aber funktioniert ist
Code: Alles auswählen
LOCAL aFiles := Directory("d:\Bilder\*.JPG")
LOCAL iMax := Len(aFiles)
LOCAL i
LOCAL a,b
a := ::oBMP1:SetBuffer()
FOR i := 1 TO iMax
::oBMP2 := XbpBitmap():new():create()
::oBMP2:loadfile("d:\Bilder\"+aFiles[i][1])
b := ::oBMP2:SetBuffer()
IF a = b
Msgbox("a = b")
EXIT
ENDIF
NEXT
gruss by OHR
Jimmy
Jimmy
- brandelh
- Foren-Moderator
- Beiträge: 15710
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 73 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Binärdaten suchen
länge von Indexbegriffen ist begrenzt. Ein MD5 ist z.B. ein eindeutiger Schlüssel der immer 32 Byte lang ist ...
Gruß
Hubert
Hubert
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2832
- Registriert: Fr, 08. Feb 2008 21:29
- Hat sich bedankt: 99 Mal
- Danksagung erhalten: 13 Mal
Re: Binärdaten suchen
Hallo,
also, ein MD5 Hash alleine ist NICHT EINDEUTIG. Er wird es, wenn man ihn mit der Länge der Originals (ob nun String oder Datei) verbindet. Diese Kombination ist mit hoher Wahrscheinlichkeit eindeutig.
Mehr zum Thema MD5 hier: http://de.wikipedia.org/wiki/Message-Digest_Algorithm_5
also, ein MD5 Hash alleine ist NICHT EINDEUTIG. Er wird es, wenn man ihn mit der Länge der Originals (ob nun String oder Datei) verbindet. Diese Kombination ist mit hoher Wahrscheinlichkeit eindeutig.
Mehr zum Thema MD5 hier: http://de.wikipedia.org/wiki/Message-Digest_Algorithm_5
Liebe Grüsse aus der Eifel,
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
- Jan
- Marvin
- Beiträge: 14662
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Binärdaten suchen
Moin,
Danke für Eure Gedanken dazu. Nur um das richtig zu stellen:
Danke für Eure Gedanken dazu. Nur um das richtig zu stellen:
- Es gibt keinen Index auf das Feld. Würde auch keinen Sinn machen aus verschiedenen Gründen.
- Ich habe keine Objekte oder Dateien, nur Strings oder Feldinhalte.
- Es geht eindeutig immer um das exakte Bild. Variationen davon würde ich als unterschiedliche Bilder ansehen und dann auch getrennt speichern.
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2832
- Registriert: Fr, 08. Feb 2008 21:29
- Hat sich bedankt: 99 Mal
- Danksagung erhalten: 13 Mal
Re: Binärdaten suchen
Hallo, Jan -
ein denkbares Vorgehen wäre - um die Vorschläge mal zu bündeln - je Zeichenkette den MD5 zu ermitteln und diesen zusammen mit der Länge der Zeichenkette in der Datei zu speichern. Dann könntest Du (falls diese Option gegeben ist), einen Index über das MD5 und das Längenfeld legen und hättest darüber eine schnelle Kontrolle, ob identische Daten vorhanden sind.
Findest Du eine Übereinstimmung, kannst Du (wenn gewünscht) die beiden Zeichenketten in einer Schleife Byte für Byte vergleichen, um eine letzte Gewissheit zu haben.
Das sollte eigentlich der schnellste Weg sein.
Als Alternative kannst Du die Datei natürlich durchlesen und Länge bzw. MD5 für jeden Satz vergleichen.
ein denkbares Vorgehen wäre - um die Vorschläge mal zu bündeln - je Zeichenkette den MD5 zu ermitteln und diesen zusammen mit der Länge der Zeichenkette in der Datei zu speichern. Dann könntest Du (falls diese Option gegeben ist), einen Index über das MD5 und das Längenfeld legen und hättest darüber eine schnelle Kontrolle, ob identische Daten vorhanden sind.
Findest Du eine Übereinstimmung, kannst Du (wenn gewünscht) die beiden Zeichenketten in einer Schleife Byte für Byte vergleichen, um eine letzte Gewissheit zu haben.
Das sollte eigentlich der schnellste Weg sein.
Als Alternative kannst Du die Datei natürlich durchlesen und Länge bzw. MD5 für jeden Satz vergleichen.
Liebe Grüsse aus der Eifel,
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
- brandelh
- Foren-Moderator
- Beiträge: 15710
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 73 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Binärdaten suchen
besser ... kombiniere beides zum eindeutigen MD5 und speichere diesen ...
MD5 auf Datei => 32 byte + str(len(datei),18) => darauf nochmal MD5 => diesen speichern und auch nach diesem suchen ... in Datei nur 32 Byte, mit index ODER dbLocate ...
MD5 auf Datei => 32 byte + str(len(datei),18) => darauf nochmal MD5 => diesen speichern und auch nach diesem suchen ... in Datei nur 32 Byte, mit index ODER dbLocate ...
Gruß
Hubert
Hubert
- Jan
- Marvin
- Beiträge: 14662
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Binärdaten suchen
Hallo,
so, ich hab das jetzt mal so versucht:
Das funktioneirt nach ersten Tests einwandfrei. Und auch schnell. Wobei ich trotzdem überlege, eventuell ein Feld für den cHash anzulegen.
Die Frage für mich ist aber immer noch, warum binärdaten nicht direkt gefunden werden können. Egal ob über einen Vergleich oder über DbLocate().
Jan
so, ich hab das jetzt mal so versucht:
Code: Alles auswählen
bBild := LoadFromUrl(aMemories[i][6]) // Bild herunterladen
cHash := Char2Hash(bBild)
nLaenge := Len(bBild)
DO WHILE .NOT. bilder->(EoF())
IF Char2Hash(bilder->bild) == cHash .AND. Len(bilder->bild) == nLaenge
Exit
ENDIF
bilder->(DbSkip())
ENDDO
Die Frage für mich ist aber immer noch, warum binärdaten nicht direkt gefunden werden können. Egal ob über einen Vergleich oder über DbLocate().
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- brandelh
- Foren-Moderator
- Beiträge: 15710
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 73 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Binärdaten suchen [Erledigt]
wie sah den der suchcode aus ?
zumindest field->bild == cBildBuffer sollten identisch sein ... wenn field->bild := cBildBuffer aufgerufen wurde.
Möglich wäre, dass der Vergleich eine hohe Längenbegrenzung hat, die wir normalerweise nicht erreichen.
Wo hast du die Funktion Char2Hash(bBild) her ?
zumindest field->bild == cBildBuffer sollten identisch sein ... wenn field->bild := cBildBuffer aufgerufen wurde.
Möglich wäre, dass der Vergleich eine hohe Längenbegrenzung hat, die wir normalerweise nicht erreichen.
Wo hast du die Funktion Char2Hash(bBild) her ?
Gruß
Hubert
Hubert
- Jan
- Marvin
- Beiträge: 14662
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Binärdaten suchen [Erledigt]
Hallo Hubert,
Char2Hash() ist eine Standard-Xbase++-Funktion.
Und field->bild == cBildBuffer hat ja eben leider nicht funktioniert. Das war ja das Problem.
Jan
Char2Hash() ist eine Standard-Xbase++-Funktion.
Und field->bild == cBildBuffer hat ja eben leider nicht funktioniert. Das war ja das Problem.
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- brandelh
- Foren-Moderator
- Beiträge: 15710
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 73 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Binärdaten suchen [Erledigt]
woher weißt du dann, dass der Inhalt wirklich noch gleich ist
wie lädst du die datei ? memoread ist möglicherweise schuld, OEM / Ansi Umwandlung ?
wie lädst du die datei ? memoread ist möglicherweise schuld, OEM / Ansi Umwandlung ?
Gruß
Hubert
Hubert
- Jan
- Marvin
- Beiträge: 14662
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Binärdaten suchen [Erledigt]
Hallo Hubert,
die Datei wird per LoadFromUrl() aus dem Internet geladen, und direkt ohne jede Umwandlung in dem V-Memo-Feld gespeichert.
Jan
die Datei wird per LoadFromUrl() aus dem Internet geladen, und direkt ohne jede Umwandlung in dem V-Memo-Feld gespeichert.
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- brandelh
- Foren-Moderator
- Beiträge: 15710
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 73 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Binärdaten suchen [Erledigt]
dann speichere die Datei dazwischen auf die Festpatte (t1.bin),
schreibe in v feld, lese in neue var und speichere in datei t2.bin ...
wenn keinen unterschied findet, ist alles ok ... wenn nicht
Nur so kannst du sicher sein, dass die Daten OK sind ... JPG ? dann noch mit paint öffnen ...
Möglicherweise werden aus dem V Feld Füllbytes angehängt.
PS: ich meine ich hätte schon 600 MB Strings miteinander verglichen , das ging ...
schreibe in v feld, lese in neue var und speichere in datei t2.bin ...
wenn
Code: Alles auswählen
comp t1 t2
Nur so kannst du sicher sein, dass die Daten OK sind ... JPG ? dann noch mit paint öffnen ...
Möglicherweise werden aus dem V Feld Füllbytes angehängt.
PS: ich meine ich hätte schon 600 MB Strings miteinander verglichen , das ging ...
Gruß
Hubert
Hubert
- Jan
- Marvin
- Beiträge: 14662
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Binärdaten suchen [Erledigt]
Hallo Hubert,
die Daten werden meiner Meinung nach korrekt gespeichert. Ich schreibe die Inhalte der V-Memo-Felder teilweise wieder auf die Platte, die sind 1a.
Abgesehen davon sind ja der Hash und die Lenge von Feldinhalt und Internet-String gleich. Also sollten Feldinhalt und String sehr wahrscheinlich auch identisch sein.
Jan
die Daten werden meiner Meinung nach korrekt gespeichert. Ich schreibe die Inhalte der V-Memo-Felder teilweise wieder auf die Platte, die sind 1a.
Abgesehen davon sind ja der Hash und die Lenge von Feldinhalt und Internet-String gleich. Also sollten Feldinhalt und String sehr wahrscheinlich auch identisch sein.
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9394
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 105 Mal
- Danksagung erhalten: 364 Mal
- Kontaktdaten:
Re: Binärdaten suchen [Erledigt]
Der Vergleich von SHA1-Hashes sollte meistens funktionieren. Es ist zwar denkbar, dass unterschiedliche Daten gleiche Hashes (die immer nur 40 Zeichen lang sind!) produzieren, aber nicht eben wahrscheinlich. Eine Alternative wäre die Konvertierung der Binärdaten z.B. mit Str2Hex(), dann könnte man auch direkt und verlustfrei vergleichen - und müsste nicht immerzu umrechnen (nur bei der Anzeige der Bilder).
Herzlich,
Tom
Tom
- brandelh
- Foren-Moderator
- Beiträge: 15710
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 73 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Binärdaten suchen [Erledigt]
ich wollte nur darauf hinweisen dies zu prüfenJan hat geschrieben:die Daten werden meiner Meinung nach korrekt gespeichert.
Ich schreibe die Inhalte der V-Memo-Felder teilweise wieder auf die Platte, die sind 1a.
Abgesehen davon sind ja der Hash und die Lenge von Feldinhalt und Internet-String gleich.
Gruß
Hubert
Hubert