Deutsch
Quelltexte/ Codesnippets

Compress Crunch Crypt Pack Speicherdatei Verschlüssel

 
- Seite 1 -



Frank
Abbing
Daten packen ohne Dll, nur mittels API.
================================================================================
================================================================================/
Daten packen/entpacken ohne Dll, nur mittels API.
© 2008 Frank Abbing, http://frabbing.de
Def RtlCompressBuffer(8) !"ntdll.dll", "RtlCompressBuffer"
Def RtlDecompressBuffer(6) !"ntdll.dll", "RtlDecompressBuffer"
Def RtlGetCompressionWorkSpaceSize(3) !"ntdll.dll", "RtlGetCompressionWorkSpaceSize"
Def RtlMoveMemory(3) !"kernel32.dll", "RtlMoveMemory"
Speicherbereich packen. Parameter: (Speicherbereich, Anzahl Bytes im Speicherbereich)

Proc CompressBuffer

    Parameters bbereich#, cbx&
    Declare cstatus&, bworkspacesize&, fworkspacesize&, cbereich#, workspace#
    cstatus&=0

    IfNot RtlGetCompressionWorkSpaceSize(2, Addr(bworkspacesize&), Addr(fworkspacesize&))

        Dim workspace#,bworkspacesize&
        Dim cbereich#,cbx&+400

        IfNot RtlCompressBuffer(2,bbereich#,cbx&,cbereich#,cbx&+400,0,Addr(bworkspacesize&),workspace#)

            Clear bbereich#
            Long bbereich#,0=cbx&
            RtlMoveMemory(bbereich#+4,cbereich#,bworkspacesize&)
            cstatus&=bworkspacesize&+4

        EndIf

        Dispose workspace#
        Dispose cbereich#

    Endif

    Return cstatus&
    Rückgabe: Anzahl der gepackten Bytes. Die gepackten Daten wurden in den übergebenen Speicherbereich kopiert.

EndProc

Originale Speichergrösse ermitteln. Parameter: (gepackter Speicherbereich#)

Proc GetDecompressSize

    Parameters bbereich#
    Return Long(bbereich#,0)

EndProc

Speicherbereich entpacken. Parameter: (gepackter Speicherbereich, Anzahl Bytes im gepackten Speicherbereich, freier Speicherbereich)

Proc DecompressBuffer

    Parameters bbereich#, cbx&, cbereich#
    Declare bworkspacesize&

    IfNot RtlDecompressBuffer(2,cbereich#,Long(bbereich#,0),bbereich#+4,cbx&-4,Addr(bworkspacesize&))

        Return bworkspacesize&

    EndIf

    Return 0
    Rückgabe: Anzahl der entgepackten Bytes.

EndProc

================================================================================
================================================================================/
====> HAUPTPROGRAMM
Declare bereich#, bereich2#, text$, x&, xcopy&, newbytes&
Cls

While 1

    text$=LoadFile$("Datei zum Packen aussuchen","")

    If text$<>""

        Packen testen
        x&=FileSize(text$)
        xcopy&=x&

        If x&

            Dim bereich#, x&+400
            BlockRead(text$, bereich#, 0, x&)
            newbytes&=CompressBuffer(bereich#, x&)

            If newbytes&

                Set("Decimals",2)
                Print "Dateiname: "+text$
                Print "Originalgrösse liegt bei "+Str$(x&)+" Bytes, comprimiert bei "+Str$(newbytes&)+" Bytes."
                Print "Packrate liegt bei "+Str$(100-(newbytes&*100/x&))+" Prozent."
                text$=text$+".pck"
                BlockWrite text$, bereich#, 0, newbytes&
                Dispose bereich#
                Entpacken testen
                x&=FileSize(text$)

                If x&

                    Dim bereich#, x&
                    BlockRead(text$, bereich#, 0, x&)
                    newbytes&=GetDecompressSize(bereich#)
                    Dim bereich2#,newbytes&
                    x&=DecompressBuffer(bereich#, x&, bereich2#)

                    If x&

                        text$=text$+".org"
                        BlockWrite text$, bereich2#, 0, x&
                        Print "Dateiname: "+text$
                        Print "Decomprimierte Originalgrösse beträgt "+Str$(x&)+" Bytes."
                        Print

                    Else

                        Print text$+" konnte nicht entpackt werden."
                        Print

                    EndIf

                    Dispose bereich2#
                    Dispose bereich#

                EndIf

            Else

                Dispose bereich#
                Print text$+" konnte nicht gepackt werden."

            EndIf

        EndIf

    Else

        BREAK

    EndIf

EndWhile

WaitInput
End
 
04.09.2008  
 



 
- Seite 1 -



Frank
Abbing
Welche Windowsversion (bitte in der Signatur angeben )?
Huh, Zeile 413? Soviel Zeilen hat der Code ja bei Weitem nicht.
Da der Source beigelegt ist, kannst du gerne die Ursache erforschen. Meine Tests verliefen alle fehlerfrei.
 
13.09.2008  
 




Bernhard
Künzel
Hallo Frank,
Win Version XP Home SP2
Profan Version XProfan11ßRC9
Test mit deiner Compress.exe:
In der MessageBox kommt die Fehlermeldung "Zu wenig Speicher für Bereichs-Variable!"
Zeile 413! und im Profanfenster steht ".....konnte nicht gepackt werden"
Mit deinem Quellcode:
Hier kommt nur die Meldung im Profanfenster ".....konnte nicht gepackt werden"

lg
Bernhard
 
13.09.2008  
 




Frank
Abbing
Sieht aus, als wäre dein Arbeitsspeicher zur Neige gagangen. Profan kann so viel Speicher nicht mehr reservieren. Das ist dann kein Programmfehler, daher keine Fehlermeldung, sondern ein Abbruch mit Information.
Ich bin deswegen so pingelig, da ich einfach nur sicher stellen möchte, dass der Code fehlerfrei läuft.
 
13.09.2008  
 



 
- Seite 2 -



Bernhard
Künzel
Hallo Frank,
habe eine wav Datei erfolgreich mit über 38,2 MB gepackt
daher kann es am Arbeitsspeicher nicht liegen.
 
13.09.2008  
 




Sebastian
Sprenger
Ich hab die Ursache...
Bernhards Dateien werden durch das Packen nicht kleiner, sondern größer und passen deshalb nicht in den Bereich, in dem Frank die Daten komprimieren lässt. Wenn ich die Bereiche um 399 Bytes größer anlege:
Zeile 27: Dim cbereich#,cbx&+399
Zeile 29: IfNot RtlCompressBuffer(2,bbereich#,cbx&,cbereich#,cbx&+399,0,Addr(bworkspacesize&),workspace#)
Zeile 106: Dim bereich#, x&+399
funktionieren sie alle.
Gruß, Sebastian
 
Profan² 7.0e, XProfan 9, 11.2a, FreeProfan32
Windows Vista Home Premium 32-Bit, 2.8 Ghz, 4 GB RAM
Windows Me, 1.8 Ghz, 256 MB RAM
13.09.2008  
 




Frank
Abbing
Ist bei mir nicht der Fall. Können die Daten nicht gepackt werden, "stoppt" die Routine rechtzeitig. Alles andere ist ja auch Quatsch.
 
14.09.2008  
 




Bernhard
Künzel
Hallo Sebastian,
du hast die richtige Ursache gefunden, durch deine Änderungen werden die Dateien jetzt gepackt, aber eben mit einem größeren Code als das Original.

Hallo Frank,
es betrifft alle Dateien wo die Compression einen größeren Code erzeugt.
der Fehlertext ist in deinem Quellcode (siehe oben) eingebaut
Else
Dispose bereich#
Print text$+" konnte nicht gepackt werden."
EndIf

Meine gesendeten Dateien können somit auch bei dir nicht funktionieren. Dein XProfan wird nicht einen größeren Bereich reservieren als bei mir.
Es ist ja auch kein Fehler in deinem Code, denn wenn der gepackte Coder größer wird als das Original, ist es nicht sehr sinnvoll diesen zu packen.
Aber die Fehlermeldung sollte dann lauten "keine Compression möglich"
Was da alles Quatsch sein soll, verstehe ich wirklich nicht.
 
14.09.2008  
 




Frank
Abbing
Der Packfunktion wird ja die Grösse der Daten übergeben. Wird der Wert überschritten, sollte die API die Compression stoppen, und bei mir tut sie das auch. Ich erhalte die Programm-Meldung, aber ohne einen Absturz.
 
14.09.2008  
 




Thomas
Freier
Super! Und schnell. Damit brauch ich mir über die Verschlüsselung der Vereinsdaten keine Gedanken mehr machen. Die *.dbf Dateien waren wieder einsetzbar und die die Kompressionswerte lagen bei 70%.
 
Gruß Thomas
Windows XP SP2, XProfan X2
14.09.2008  
 




Frank
Abbing
Genau, Thomas. Ich werde mal "Verschlüsselung" mit in den Titel aufnehmen.

@Sebastian: Hab deine Änderungen in den Code eingebaut, die 400 Byte tun niemandem weh, wenn es dafür überall funktioniert.
 
14.09.2008  
 




E.T.
Mal ne Frage: was ist das eigentlich für ein Format, was da raus kommt.
Können die Datein dann nur mit dieser Routine wieder entpackt werden ??

NACHTRAG: Kann ich damit auch einen ganzen Ordner sicher packen (Statt Dateiname ein Verzeichnis übergeben) ??

Ja.

Wenn du einen ganzen Ordner packen willst, musst du die Daten der einzelnen Files selber verwalten. Also dir ein eigenes Format dafür schaffen.
 
Grüße aus Sachsen... Mario
WinXP, Win7 (64 Bit),Win8(.1),Win10, Win 11, Profan 6 - X4, XPSE, und 'nen schwarzes, blinkendes Dingens, wo ich das alles reinschütte...
15.12.2008  
 



Zu Erstens glaub ich "Ja", zu Zweitens glaub ich "Nein".
 
15.12.2008  
 




Zum Quelltext


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

18.692 Betrachtungen

Unbenanntvor 0 min.
p.specht01.06.2018
Erasmus.Herold21.01.2016
Profanet16.01.2016
Julian Schmidt06.01.2013
Mehr...

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie