Checksum und Rar

  • Hiho,

    ich wollte mal fragen, ob man das packen und entpacken von rar-dateien rein mit autoit umsetzen kann?
    schön wäre natürlich, wenn das ganze auch ohne irgendwelche fileinstalls auskommen würde.

    zur zeit habe ich die rar.exe (cmd-tool von winrar) in ein script eingebunden.

    was auch noch interessant wäre, wie es mit der schnelligkeit aussehen würde ... ist die in etwa gleich oder ist die rar.exe wesentlich schneller?

    zusätzlich habe ich auch ein tool names fsum, welches crc32 checksummen in sfv dateien hinterlegt, bzw. dies wieder vergleicht.
    gibt es hierfür auch eine möglichkeit, dies in autoit umzusetzen (wiederum ohne filesinstall) die auch schnell(er) ist?

    besten dank =)

  • Hallo,

    1. RAR-Dateien behandeln mit AutoIt sollte grundsätzlich gehen. Das Format scheint ja OpenSource zu sein, da 7Zip es unterstützt. Ich wüsste jetzt aber kein Beispiel, zudem sollte das Ganze auch recht aufwendig sein, wenngleich nicht unbedingt sinnlos, da zumindest bei Archiven mit geringer Kompression die Festplatte und nicht der Algorithmus der Flaschenhals sein sollte. Schaue dafür am Besten im englischen Forum nach.
    2. Ja, ist möglich. Eine komplette Lösung mit AutoIt macht aber keinen Sinn, da dies viel zu langsam ist. Hier eine UDF die ich (von welchem Autor sie ursprünglich stammt weiß ich leider nicht) modifiziert habe. Sie funktioniert mittels OpCode und einem DLL-API-Call:

    Spoiler anzeigen
    [autoit]

    #include <WinAPI.au3>
    #Region - Example.
    Local Const $sTEXTPART0 = "The quick brown fox "
    Local Const $sTEXTPART1 = "jumps over the lazy dog"
    Local Const $sTEXTFULL = $sTEXTPART0 & $sTEXTPART1
    MsgBox(64, "_HashCRC32", "FullString: " & _HashCRC32($sTEXTFULL) _
    & @CRLF & "PartialStrings: " & _HashCRC32($sTEXTPART1, _HashCRC32($sTEXTPART0)))
    #EndRegion - Example.

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

    Func _HashCRC32(Const $vDATA, Const $iCRC32 = 0x000000)
    Local Const $sOPCODECRC = "0xC800040053BA2083B8EDB9000100008D41FF516A0859D1E8730231D0E2F85989848DFCFBFFFFE2E78B5D088B4D0C8B451085DB7416E3148A1330C20FB6D2C1E80833849500FCFFFF43E2ECF7D05BC9C21000"
    Local Const $STRUCT_CODEBUFFER = DllStructCreate("byte[" & BinaryLen($sOPCODECRC) & "]")
    Local Const $STRUCT_INPUT = DllStructCreate("byte[" & BinaryLen($vDATA) & "]")

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

    DllStructSetData($STRUCT_CODEBUFFER, 1, $sOPCODECRC)
    DllStructSetData($STRUCT_INPUT, 1, $vDATA)

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

    Local Const $vReturn = _WinAPI_CallWindowProc(DllStructGetPtr($STRUCT_CODEBUFFER), _
    DllStructGetPtr($STRUCT_INPUT), BinaryLen($vDATA), BitNOT(Dec($iCRC32)), 0)
    If @error Then Return SetError(@error, 0, False)

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

    Return StringLower(Hex($vReturn))
    EndFunc ;==>_HashCRC32

    [/autoit]


    Das Beispiel sollte für sich sprechen!