Datei aus einem Array binär in eine Datei schreiben (FileOpen Mode 16 + 1)

  • Huhu,

    Das Script soll eine Datei binär einlesen, in ein Array übergeben und anschließend in eine andere, neu erstellte Datei, die im Mode 17 geöffnet wurde, schreiben.
    Das Problem liegt an der Stelle, dass ich mit FileWrite Step by Step schreibe.
    Die Datei nimmt an Größe zu. Nach jedem partiellem Schreibvorgang wird durch FileWrite etwas Zusätzliches angehängt.
    Füge ich die Einzelstrings des Arrays intern zusammen und schreibe die Datei in einem Rutsch, funktioniert alles problemlos. Meine Testdateien sind ca. 10MB und 50MB groß.

    Spoiler anzeigen
    [autoit]


    Local $fo = FileOpen("test.wmv", 16)
    Local $data = FileRead($fo)
    Local $backup = $data
    Local $length = StringLen($data)
    Local $max = 10000000
    FileClose($fo)
    Local $File = "mov.wmv"

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

    ;MsgBox(0, '', $length)
    If $length > $max Then
    Local $FileOut = FileOpen($File, 16+1)
    local $dat[Ceiling($length/$max)]
    For $i = 0 To UBound($dat)-1 Step +1
    $dat[$i] = StringLeft($data, $max)
    $data = StringTrimLeft($data, $max)
    FileWrite($FileOut, Binary($dat[$i]))
    Next
    Else
    Local $FileOut = FileOpen($File, 16+2)
    FileWrite($FileOut, Binary($data))
    EndIf
    FileClose($FileOut)
    $data = ''
    For $j = 0 To UBound($dat)-1 Step +1
    $data &= $dat[$j]
    Next
    ;$data = StringReplace($data, "a", "1")
    MsgBox(0, '', StringLen($data) & ', ' & StringLen($backup) & ': ' & StringCompare($data, $backup))
    Local $FileOut2 = FileOpen("test_size.wmv", 16+2)
    FileWrite($FileOut2, Binary($data))
    FileClose($FileOut2)

    [/autoit]

    Grüße

  • Hi
    sieh dir mal die Datei in einem Hex-Editor an, ich denke dass das Problem folgendes ist die Daten im Array werden als Strings interpretiert, da du aber Binary schreibst, werden die Daten die ja eigentlich unverändert in die Datei sollten umgewandelt, du musst also die Daten so umwandeln dass sie wenn sie nach Binary umgewandelt werden den Ursprungsdaten entsprechen.
    mfg
    Redclaw

  • dat[0] wird in die Datei geschrieben. Dieser Teil funktioniert.
    Alles was beim wiederholten Schreiben geschrieben wird (dat[1] ... dat[∞]), funktioniert nicht, da FileWrite irgendetwas dazwischen packt. Bei der 10MB Datei sind es ~2*10^6 Zeichen. Die ersten 18,7s des Videos kann ich auch ansehen, bis der Player meckert: die Datei sei beschädigt.

    Zum Hex-Editor:
    Das Habe ich schon gemacht. Die ersten ~8400 Seiten sind identisch mit der ursprünglichen Datei.