Textdatei einlesen und als binary speichern.

  • Hallo libe Gemeinde,

    ich werd noch kirre! Ich möchte einfach ein text file (sieht wie folgt aus)

    :200100001D0080470C800000009000000000000000000000000000000000000000000000DF
    :200120000040036D0022286D000C006D00AE086D0080006D00C21E6D00C0251D0026004D
    :20014000911000FDDA00D9FF28D834FF911000FD8200D9FF7C5A820189F04009911000FD6B
    :200160008200D9FF506A820189F04009911000FD8200D9FF446A820189F04009911000FD9D
    :20018000D9FF4C6A34FF00906D00141C6D003200911000FDD9FF4C6ADA0134FF3C246D00CB
    usw.
    auslesen, den orange markierten Teil extrahieren und dann diesen extrahierten String in ein temp file im binär Format speichern. Dies würde dann in einem Hex-Editor für die erste Zeile in etwa so aussehen.

    00000000h: 1D 00 80 47 0C 80 00 00 00 90 00 00 00 00 00 00
    00000010h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

    Ich bekomm's auch so einigermaßen hin aber die Nullen im String stellen ein Problem dar. Hier mein Skript:

    Spoiler anzeigen
    [autoit]

    ;Sourcefile öffnen
    $hFile = FileOpen(@ScriptDir & "\test.hex", 0)
    If $hFile = -1 Then
    MsgBox(4096,"ERROR","Reading sourcefile failed!!!")
    Exit
    EndIf

    ; temp file
    $temp_file = FileOpen(@ScriptDir & "\test.tmp",2 + 16)
    If $temp_file = -1 Then
    MsgBox(4096,"ERROR","Opening temp file failed!!!")
    Exit
    EndIf

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

    ; index der aktuell gelesenen Zeile
    $i = 1

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

    ; File einlesen
    While 1

    ; Lese Zeile fuer Zeile
    $string = FileReadLine($hFile, $i)
    If @error = -1 Then ExitLoop

    $sString = ""

    ; Extrahiere Datensatz
    $StringLength = StringLen(StringMid($string, 10, StringLen($string)- 1 - 10))

    ; wandle jedes byte in ein ASCII Zeichen
    for $j = 1 to $StringLength Step 2
    $char = Chr("0x" & StringMid(StringMid($string, 10, StringLen($string)- 1 - 10), $j, 2))

    $sString = $sString & $char
    Next

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

    ; schreibe Zeile fuer zeile in temp file
    If Not FileWrite($temp_file, $sString) Then
    MsgBox(0, "Error", "Unable to write File")
    Exit
    EndIf

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

    $i = $i + 1

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

    Wend

    FileClose($hFile)
    FileClose($temp_file)

    [/autoit]


    Das Ergbenis dieses Skripts sieht im Hex Editor betrachtet, wie folgt aus:

    00000000h: FF FE 47 00 0C 00 80 00 00 00 00 00 00 00 90 00
    00000010h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

    1.) Das FF FE bedeutet wohl UTF-16 Little Endian. Aber woher kommt das? ich sag doch bei FileOpen, dass ich das File im binary Mode schreiben will.

    2.) Wo sind die ersten 3 Zeichen (1D0080) hin???

    Hoffe Ihr könnt mir weiterhelfen.

    Danke im voraus!!!

    Einmal editiert, zuletzt von Dustmaster80 (3. März 2011 um 15:36)

  • Gleiches Verhalten.....auch wenn ich das sourcefile im binary mode öffne

    Trotzdem danke!

  • Quelldatei im Textmodus öffnen, Binästring auslesen, zusammensetzen:
    $sBinaryString = "0x" & $sTeil1 & $sTeil2...
    $bBinary = Binary($sBinaryString)
    Dann in eine Datei schreiben (Binärschreibmodus = 16 + 2)

  • Probiere es mal damit:

    [autoit]


    $sData = FileRead(@ScriptDir & "\test.txt")
    $newData = "0x" & StringStripCR(StringReplace(StringRegExpReplace($sData, "(?m).{9}(.*).{1}\w", "$1"), Chr(10), ""))
    $hFile = FileOpen(@ScriptDir & "\test.bin", 18)
    FileWrite($hFile, $newData)
    FileClose($hFile)

    [/autoit]

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯