Frage zu FileRead()

  • Hallo Zusammen.

    Weil ich kein eingenttliches Problem mit einem Skript habe, habe ich den Thread mal im Offtopic erstellt.

    Also ich habe mir ein etwas älteres Skript genommen, bei dem ich früher schonmal Hilfe gebraucht hatte und mir Oscar die beste Lösung geliefert hatte:

    Datei Verschlüsselung
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <String.au3>

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

    $Form1 = GUICreate("Lenny's FileCrypter", 632, 345, 194, 132, BitOR($WS_POPUP, $WS_BORDER, $WS_CLIPSIBLINGS))
    $Pic1 = GUICtrlCreatePic("C:\Dokumente und Einstellungen\Lenny\Eigene Dateien\Lenny's.jpg", 0, 0, 632, 150, BitOR($SS_NOTIFY, $SS_SUNKEN, $WS_GROUP, $WS_BORDER, $WS_CLIPSIBLINGS), $GUI_WS_EX_PARENTDRAG)
    $Button1 = GUICtrlCreateButton("Datei zum Verschlüsseln wählen", 40, 160, 243, 25, $WS_BORDER)
    GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
    $Button2 = GUICtrlCreateButton("Datei zum Entschlüsseln wählen", 344, 160, 243, 25, $WS_BORDER)
    GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
    Global $Input1 = GUICtrlCreateInput("Pfad", 40, 200, 545, 21)
    GUICtrlSetState(-1, $GUI_DISABLE)
    $Label1 = GUICtrlCreateLabel("0% (0 von 0 KB)", 45, 284, 298, 20)
    GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
    Global $Progress1 = GUICtrlCreateProgress(40, 304, 294, 17)
    $Button3 = GUICtrlCreateButton("Close me.", 352, 304, 227, 17, 0)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    _verschluesseln()
    Case $Button2
    _entschluesseln()
    Case $Button3
    Exit
    EndSwitch
    WEnd

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

    Func _verschluesseln()
    Local $iProgress, $iCryptLevel, $sFilePath, $iFileSize, $hSource, $hTarget, $sFileBlock, $iPercent, $old
    GUICtrlSetState($Button1, $GUI_DISABLE) ; Button deaktivieren
    $sFilePath = FileOpenDialog("Datei zum Verschlüsseln auswählen", "", "Alle Dateien (*.*)", 1)
    If Not @error Then
    GUICtrlSetData($Input1, $sFilePath)
    $iFileSize = FileGetSize($sFilePath) ; Dateigröße auslesen
    $hSource = FileOpen($sFilePath, 16) ; Quelldatei im Binary-Mode öffnen
    $hTarget = FileOpen($sFilePath & ".lfc", 2 + 8 + 16) ; Zieldatei im Binary-Mode zum Schreiben öffnen
    While True
    $sFileBlock = FileRead($hSource, 64) ; einen 64 Byteblock aus der Quelldatei lesen
    If @error = -1 Then ExitLoop ; Wenn @error = -1, dann Dateiende erreicht / Schleife verlassen
    FileWrite($hTarget, _BlockEncrypt($sFileBlock, "cTDE808Ww7y53mn1o6AsS528aZE03i91")) ; den Block verschlüsseln und speichern;
    $iProgress += 64 ; Wert für die Progressbar addieren
    $iPercent = Int(100 / $iFileSize * $iProgress) ; Prozentwert errechnen
    If $iPercent <> $old Then
    GUICtrlSetData($Label1, $iPercent & "% (" & _StringAddThousandsSep($iProgress, ".") & " von " & _StringAddThousandsSep($iFileSize, ".") & " Bytes)")
    GUICtrlSetData($Progress1, $iPercent) ; und anzeigen
    $old = $iPercent
    EndIf
    WEnd
    FileClose($hTarget) ; Zieldatei schließen
    FileClose($hSource) ; Quelldatei schließen
    GUICtrlSetData($Label1, "100% (fertig!)") ; Label auf 100% setzen
    GUICtrlSetData($Progress1, 100) ; Progressbar auf 100% setzen
    EndIf
    GUICtrlSetState($Button1, $GUI_ENABLE) ; Button wieder aktivieren
    EndFunc ;==>_verschluesseln

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

    Func _entschluesseln()
    Local $iProgress, $iCryptLevel, $sFilePath, $iFileSize, $hSource, $hTarget, $sFileBlock, $sPos, $sTarget, $iPercent, $old
    GUICtrlSetState($Button2, $GUI_DISABLE) ; Button deaktivieren
    $sFilePath = FileOpenDialog("Wählen sie die Datei zum DeCrypten aus", "", " (*.lfc)", 1)
    If Not @error Then
    GUICtrlSetData($Input1, $sFilePath)
    $iFileSize = FileGetSize($sFilePath) ; Dateigröße auslesen
    $hSource = FileOpen($sFilePath, 16) ; Quelldatei im Binary-Mode öffnen
    $sTarget = StringTrimRight($sFilePath, 4) ; Dateiendung (.lfc) entfernen
    If FileExists($sTarget) Then ; Wenn die Zieldatei bereits existiert, dann...
    $sPos = StringInStr($sTarget, ".", 0, -1) ; Position der Dateiendung
    $sTarget = StringLeft($sTarget, $sPos - 1) & "_Neu." & StringRight($sTarget, StringLen($sTarget) - $sPos) ; "_Neu" hinzufügen
    EndIf
    $hTarget = FileOpen($sTarget, 2 + 8 + 16) ; Zieldatei im Binary-Mode öffnen
    While True
    $sFileBlock = FileRead($hSource, 64) ; eine Zeile aus der Quelldatei lesen
    If @error = -1 Then ExitLoop ; Wenn @error = -1, dann Dateiende erreicht / Schleife verlassen
    FileWrite($hTarget, _BlockEncrypt($sFileBlock, "cTDE808Ww7y53mn1o6AsS528aZE03i91")) ; die Zeile entschlüsseln und speichern
    $iProgress += 64 ; Wert für die Progressbar addieren
    $iPercent = Int(100 / $iFileSize * $iProgress) ; Prozentwert errechnen
    If $iPercent <> $old Then
    GUICtrlSetData($Label1, $iPercent & "% (" & _StringAddThousandsSep($iProgress, ".") & " von " & _StringAddThousandsSep($iFileSize, ".") & " Bytes)")
    GUICtrlSetData($Progress1, $iPercent) ; und anzeigen
    $old = $iPercent
    EndIf
    WEnd
    FileClose($hTarget) ; Zieldatei schließen
    FileClose($hSource) ; Quelldatei schließen
    GUICtrlSetData($Label1, "100% (fertig!)") ; Label auf 100% setzen
    GUICtrlSetData($Progress1, 100) ; Progressbar auf 100% setzen
    EndIf
    GUICtrlSetState($Button2, $GUI_ENABLE) ; Button wieder aktivieren
    EndFunc ;==>_entschluesseln

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

    Func _BlockEncrypt($sCryptBlock, $sPass)
    Local $sOut = "", $iPassLen = StringLen($sPass), $j = 1, $sTemp
    For $i = 3 To StringLen($sCryptBlock) Step 2
    $sTemp = Asc(StringMid($sPass, Mod($j, $iPassLen), 1))
    $sOut &= Chr(BitXOR(Dec(StringMid($sCryptBlock, $i, 2)), $sTemp, Abs($iPassLen - $i)))
    $j += 1
    Next
    Return $sOut
    EndFunc ;==>_BlockEncrypt

    [/autoit]

    Es geht um den Bereich ab Func _verschluesseln().

    Genau um dieses Stück:

    [autoit]

    $hTarget = FileOpen($sFilePath & ".lfc", 2 + 8 + 16) ; Zieldatei im Binary-Mode zum Schreiben öffnen ;HIER
    While True
    $sFileBlock = FileRead($hSource, 64) ; einen 64 Byteblock aus der Quelldatei lesen ; HIER
    If @error = -1 Then ExitLoop ; Wenn @error = -1, dann Dateiende erreicht / Schleife verlassen
    FileWrite($hTarget, _BlockEncrypt($sFileBlock, "cTDE808Ww7y53mn1o6AsS528aZE03i91")) ; den Block verschlüsseln und speichern;
    $iProgress += 64 ; Wert für die Progressbar addieren
    $iPercent = Int(100 / $iFileSize * $iProgress) ; Prozentwert errechnen
    If $iPercent <> $old Then
    GUICtrlSetData($Label1, $iPercent & "% (" & _StringAddThousandsSep($iProgress, ".") & " von " & _StringAddThousandsSep($iFileSize, ".") & " Bytes)")
    GUICtrlSetData($Progress1, $iPercent) ; und anzeigen
    $old = $iPercent
    EndIf
    WEnd

    [/autoit]


    Dort wird ein 64 Byte Block aus der Datei gelesen. Warum klappt das auch wenn die Dateigröße nicht durch 64 teilbar ist?

    Zb haben wir 160byte: Nach 2 mal 64byte auslesen sind ja nur noch 32byte übrig.

    Oder ließt FileRead, wenn weniger bytes als die als Parameter angegebene Größe vorhanden sind, nur noch soviel wie da sind ?

    Vielen Dank im Voraus,
    Lenny :rolleyes:

    Jaja, Moo does the Cow!

  • Der Parameter gibt an, wie viel maximal gelesen wird. Daher kann auch weniger gelesen werden, wenn nichts mehr übrig ist.

  • Ok vielen Dank das ist schonmal eine wichtige Information :)

    Jetzt hätt ich noch eine Frage bezüglich dieser Größe:

    Wann ist es sinvoll eine kleinere Anzahl an Bytes zu lesen, wann eine größere ?

    Vielen Dank im Voraus,

    Lenny :)

    Jaja, Moo does the Cow!

  • Hallo Lenny.

    Also unter 32 würde ich auf keinen Fall gehen, genauso wie nicht über 128. Wenn ich das richtig interpretiere, dann wird mit einen 32-er codiert, also geht man nicht unter 32 und mehr als das vierfach vom Codierer bringt meine ich die Sicherheit in den Keller.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl