Die letzten 128 Bytes einer Datei binär lesen und schreiben

  • :) Hi,
    ich kann Dateien (MP3) binär öffnen und lesen. Allerdings kann ich nicht die letzten 128 Bytes (1Zeichen = 8 Bit= 1 Byte) korrekt auslesen, noch sie neu beschreiben wie das Demoskript aufzeigt. Tag ID V1 steckt in diesem Abschnitt. Mit StringMid, StringLeft ist dem Ganzen anscheinend nicht beizukommen. Wer weiss eine Lösung? Danke Jan


    [autoit]

    #include <File.au3>
    Opt("TrayIconDebug", 1)
    ;Preparation
    $sSciTEPath = RegRead('HKEY_CLASSES_ROOT\AutoIt3Script\Shell\Edit\Command','')
    $sMP3Search = FileFindFirstFile(StringReplace(@ScriptDir & '\*.mp3', '\\', '\'))
    $sMP3 = FileFindNextFile($sMP3Search)
    If $sMP3Search = -1 Then
    $sMP3Source = $sFileOpenDialog('Search for a .mp3 File','','MP3(*.mp3)', 1)
    $aMP3Path = StringSplit($sMP3Source, '\')
    $sMP3 = $aMP3Path[$aMP3Path[0]]
    FileCopy ($sMP3Source, @ScriptDir & $sMP3)
    EndIf
    MsgBox(4096,'MP3 found:','Take this one for reading:' & @CRLF & $sMP3, 1)

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

    ;start of the experiment
    $iMP3 = FileGetSize ($sMP3) ; for each Chr one Byte FileGetSize = whole number of Chr in file
    $hMP3 = FileOpen ($sMP3, 16) ; read in binary mode. This works
    $hControl = FileOpen ('control.txt', 2)
    $h1Write128 = FileOpen ('1Write128.txt', 2)
    $h2Write128 = FileOpen ('2Write128.txt', 22)
    $h3Write128 = FileOpen ('3Write128.txt', 22)
    $h4Write128 = FileOpen ('4Write128.txt', 2)
    $sSec128 = ''

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

    $sAllChrInMP3 = FileRead ($hMP3)

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

    FileWrite ($hControl, $sAllChrInMP3) ; this is for your control. It works
    MsgBox(4096, 'Info0', 'Controlfile finished',1)

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

    ;First try with StringLeft
    FileWrite ($h1Write128, StringRight ($sAllChrInMP3, 128)) ; try to get last 128 Chr - doesn't work
    MsgBox(4096, 'Info', 'First try finished',1)

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

    #cs
    ;Second try to read each Chr
    For $i = 1 to $iMP3
    $sChr = FileRead($hMP3, 1)
    If $i > $iMP3 -128 then $sSec128 = $sSec128 & $sChr
    Next
    FileWrite ($h2Write128, $sSec128)
    MsgBox(4096, 'Info2', 'Second try finished',1)
    #ce
    FileWrite ($h1Write128, StringRight ($sAllChrInMP3, 128)) ; try to get last 128 Chr - doesn't work
    MsgBox(4096, 'Info', 'Second try finished',1)

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

    ;Third try with StringMid
    FileWrite ($h2Write128, StringMid($sAllChrInMP3, StringLen($sAllChrInMP3) - 127, 128))
    MsgBox(4096, 'Info3', 'Third try finished',1)

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

    ;Fourth try
    $CountLines = _FileCountLines($sMP3)
    $sLastLine= FileReadLine($hMP3, $CountLines)
    FileWrite ($h4Write128, $sLastLine)
    $sAllChrInMP3 = StringRight(FileRead ($hMP3), 128)
    FileWrite ($h4Write128, $sAllChrInMP3)
    MsgBox(4096, 'Info3', 'Fourth try finished',1)

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

    ;Show the results
    FileClose($hControl)
    FileClose($h1Write128)
    FileClose($h2Write128)
    FileClose($h3Write128)
    FileClose($h4Write128)

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

    $sAllF =' "' & @ScriptDir & '\1Write128.txt" "' & @ScriptDir & '\2Write128.txt" "' & @ScriptDir & '\3Write128.txt" "' & @ScriptDir & '\4Write128.txt"';@ScriptDir & '\' & $sMP3 & '" "' & @ScriptDir & '\control.txt" "' &

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

    Run ( $sSciTEPath & $sAllF, '')

    [/autoit]

    Einmal editiert, zuletzt von janrenzlow (24. August 2007 um 21:33)

    • Offizieller Beitrag

    Hallo,

    hast Du dir schon mal die Befehle BinaryLen und BinaryMid angeschaut?!

  • Hallo Jan,
    versuche mal folgendes:

    nach dem ersten Lesen

    [autoit]

    $sAllChrInMP3 = FileRead ($hMP3)

    [/autoit]


    mach mal ein FileClose

    [autoit]

    FileClose($hMP3)

    [/autoit]


    Dann nimm folgende Zeilen:

    [autoit]

    ...
    $h2Write128 = FileOpen ('2Write128.txt', 18) ; write-open in binary mode
    ...

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

    $hMP3 = FileOpen ($sMP3, 16) ; read in binary mode. This works
    $sChr = FileRead($hMP3, ($iMP3 - 128))
    While 1
    $sChr = FileRead($hMP3, 1)
    If @error = -1 Then ExitLoop
    $sSec128 = $sSec128 & BinaryToString($sChr)
    WEnd

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

    FileWrite ($h2Write128, $sSec128)
    MsgBox(4096, 'Info2', 'Second try finished'&@CR&StringToBinary($sSec128),5)
    ...

    [/autoit]


    Damit solltest du weiterkommen.

  • Hi Bernd670,

    danke für Deinen TIp. Obwohl die Hilfe ständig bei mir in Gebrauch ist, hab ich beide Befehle nicht wahrgenommen - wahrscheinlich weil sie unter Variablen und Konvertierungen "versteckt" waren. Ich hätte sie mehr in STring-Managment vermutet. Danke Jan

  • Danke Holger alka VX....

    es hat gefunzt und ich bin endlich weitergekommen. Jan

    edit:

    Danke Holger alka VX....

    es hat gefunzt und ich bin endlich weitergekommen. Jan

    Edit GtaSpider: [24.08.2007 22:05]
    Bitte Beiträge editieren anstatt doppelpost's zu erstellen.