Fehlfunktion beim Vergleichen von Daten

  • moin moin,

    ich habe jetzt meinen ersten Quelltext in AutoIt geschrieben.

    Es geht darum, daß ich aufgezeichnete Daten (alles im Hex-Format) meiner Photovoltaikanlage so umwandeln möchte, damit sie direkt in eine Excel-Tabelle eingefügt werden können. Für einen einzelnen Tag klappt auch alles. Jeder neue Tag beginnt mit einem "FF FF", dann folgen Datum, Uhrzeit und danach werden die Umdrehungen eines Zwischenzählers aufgezeichnet. Das Problem ist jetzt, die einzelnen Tage einer größeren Datensammlung voneinander zu trennen.

    Hier einmal die Quelldaten für einen Tag:

    Spoiler anzeigen


    [Blockierte Grafik: http://dl.dropbox.com/u/4511977/AutoIt_001.png]
    Falls es jemand nachvollziehen möchte, stelle ich hier auch noch die Quelldaten hierfür zur Verfügung:

    http://dl.dropbox.com/u/4511977/Test.bin


    mit dem folgenden Quellcode möchte ich testen, ob diese beiden Bytes "FF FF" vorhanden sind:

    Spoiler anzeigen
    [autoit]


    $datei = FileOpen("d:\autoit\test.bin", 0)
    $datei1 = FileOpen("d:\autoit\test-test", 1)
    $zaehler = 0
    Dim $a[500]

    [/autoit] [autoit][/autoit] [autoit]

    If $datei = -1 Then
    MsgBox(0, "Error", "Konnte Datei nicht öffnen.")
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $buchstabe = FileRead($datei, 1)
    If @error = -1 Then ExitLoop
    $zaehler = $zaehler + 1
    $a[$zaehler] = $buchstabe
    Wend

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To $zaehler
    If $a[$i] = Chr(0xff) Then $a[$i] = Chr(0)
    FileWrite($datei1, $a[$i])
    Next

    [/autoit] [autoit][/autoit] [autoit]

    FileClose($datei)
    FileClose($datei1)

    [/autoit] [autoit][/autoit] [autoit][/autoit]


    Ich ersetze zum Testen also "FF" in "00"

    das folgende Bild ist das Ergebnis, leider nicht wie erwartet:

    Spoiler anzeigen

    Und jetzt meine Frage:

    Habe ich im Quelltext irgendetwas nicht beachtet, wodurch dieses zusätzliche Byte "9F" fälschlicherweise als "FF" interpretiert wird?

    Ich hoffe, daß jemand eine Erklärung hierfür hat.

    Falls ich nicht alle erforderlichen Angaben gemacht habe, die zur Eingrenzung des Problems erforderlich sind, bitte ich dieses schon jetzt zu entschuldigen. Ich werde es auf Anfrage dann selbstverständlich nachholen.

    mfg
    Seestern

    Einmal editiert, zuletzt von Seestern (20. Dezember 2010 um 18:59)

  • @ name22
    Ein StringReplace würde nicht ausreichen.

    Ich möchte keine Bytes austauschen. Dieser Quelltext wurde nur geschrieben, um festzustellen, warum ich die Fehlfunktion habe, also die einzelnen Tage nicht sauber voneinander getrennt werden. Die "FF" Bytes werden dann nicht mehr benötigt. Das Problem ist ja, daß "9F" als "FF" interpretiert wird.


    @ Tigger1975
    Das ist die Lösung, damit klappt es.

    Ich verstehe trotzdem nicht, warum hierfür ein doppeltes "=" erforderlich ist.

    Einmal editiert, zuletzt von Seestern (20. Dezember 2010 um 18:18) aus folgendem Grund: Text ergänzt

  • Das == erzwingt (im Gegensatz zum einfachen = ) einen Stringvergleich unter Berücksichtigung der Groß und Kleinschreibung.
    Und wenn man jetzt sieht das Chr(0x9F) = "Ÿ" und Chr(0xFF) = "ÿ" ist sollte klar werden warum diese bei einfachem = als gleich angesehen werden.

  • @ AspirinJunkie

    Vielen Dank für die erschöpfende Auskunft. :)
    Diesen Unterschied habe ich bei der Durchsicht von Infos zu AutoIt noch nicht gefunden (oder übersehen).

    Aber solche Probleme werden sich bestimmt einprägen und hoffentlich nie wieder zum Problem werden. :)

  • Dann wär als weitergehender Vorschlag die Daten auch binär zu behandeln anstatt als String - dann kommt man auch nicht erst in Versuchung StringVergleiche durchführen zu müssen.
    Als Beispiel:

    Spoiler anzeigen
    [autoit]

    Global $hDateiIn = FileOpen("test.bin", 16) ;öffnet die Datei im Binärmodus statt im Stringmodus
    Global $hDateiOut = FileOpen("test-test", 2 + 8 + 16)
    Global $ByteIn

    [/autoit] [autoit][/autoit] [autoit]

    If $hDateiIn = -1 Or $hDateiOut = -1 Then Exit

    [/autoit] [autoit][/autoit] [autoit]

    Do
    $ByteIn = FileRead($hDateiIn, 1)
    If @error = -1 Then ExitLoop
    If $ByteIn = 0xFF Then $ByteIn = Chr(0)
    FileWrite($hDateiOut, $ByteIn)
    Until 0

    [/autoit] [autoit][/autoit] [autoit]

    FileClose($hDateiIn)
    FileClose($hDateiOut)

    [/autoit]
  • @ AspirinJunkie

    Ich finde deine Lösung recht gut, die Daten binär zu behandeln und werde mir diese Möglichkeit für zukünftige Fälle merken.

    Im vorliegenden Fall bringt es mich nicht wirklich weiter, da ich das Austauschen der Bytes "FF" nach "00" nur zum Testen benutzt habe, um meiner Fehlfunktion auf die Schliche zu kommen.

    Inzwischen funktioniert mein Gesamtscript perfekt; es muß nur noch an einigen Kleinigkeiten gebastelt werden wie z.B. ohne fest vorgegebene Dateinamen. Ich habe jetzt Quelldaten von einem Jahr umgewandelt in ein Excel-konformes Format, wobei auch in Abhängigkeit von der Uhrzeit alles spaltenrichtig im ASCII-Format vorliegt. Da bei den eigentlichen Daten kein "FF" vorkommen kann, habe ich dieses zur Trennung der einzelnen Tage benutzt und mußte es jetzt dazu benutzen, eine neue Zeile zu beginnen. Da diese Bytes keine Nutzbytes sind, können und müssen sie natürlich nicht umgewandelt werden.