DLL | | | | Sven Bader | Herunterladen
allô zusammen,
wieder voudrais je une kleine DLL bereitstellen. Ab qui 5. DLL erstelle je ensuite une einzelne avec allen Funktionen
Es laisser sich MD5 Prüfsummen aus Cordes generieren, quelle on bekanntlich pour allerhand Zwecke einsetzen peux. j'ai viel getestet suis mir mais qui Stabilität et Korrektheit encore pas 100% sûrement. je suis mich ici alors sur Feedback!
Viele Grüße Sven
ici un Beispielaufruf. Es braucht une kleine Hilfsfunktion, là Funktionsaufrufe et Rückgaben dans DLL Cordes seulement comme Adresse verarbeiten peut:
ou bien entier sans DLL nativ dans XProfan. Beim Compilieren dans XProfan anstatt Profan2CPP devrait qui Compileranweisung im "Proc md5_rl" encore entfernt volonté. cela unsigned right shift <<<, un paire | = Zuweisungen et qui Tilde ~ (Bitwise Not) musste je paraphraser, là es cet dans XProfan pas gibt. je basiere incidemment sur dem C++ Code de Paul Johnston [...]
Def md5_tilde(1) (&(1) * (-1) -1)'~
Déclarer md5_x&[524288], md5_hc$
'right shift unsigned >>>
Proc md5_rsu
Paramètres a&, b&
Déclarer x&
x& = a& >> b&
whileloop 0, b&-1
x& = setbit(x&,31-&loop,0)
endwhile
return x&
ENDPROC
Proc md5_rh
Paramètres n&
Déclarer j&, s$
s$ = »
Whileloop 0, 3
j& = &loop
s$ = s$ + Mid $(md5_hc$, ((n& >> (j&*8 + 4)) & $0F)+1,1) + Mid $(md5_hc$, ((n& >> (j&*8)) & $0F)+1,1)
Endwhile
return s$
ENDPROC
Proc md5_ad
Paramètres x&, y&
Déclarer l&, m&, return&
l& = (x& & $FFFF) + (y& & $FFFF)
m& = (x& >> 16) + (y& >> 16) + (l& >> 16)
return& = (m& << 16) | (l& & $FFFF)
return return&
ENDPROC
Proc md5_rl
Déclarer return&
$IFDEF COMPILER
'P2CPP: <INLINE_CPP>
unsigned long lN = LongParam(1);
unsigned long lC = LongParam(2);
unsigned unsigned rr = (lN >> (32 - lC));
lReturn = _L(((lN << lC))) | _L(rr);
'P2CPP: </INLINE_CPP>
$ELSE
Paramètres n&,c&
return& = (n& << c&) | md5_rsu(n&,(32-c&))
$ENDIF
return return&
ENDPROC
Proc md5_cm
Paramètres q&,a&,b&,x&,s&,t&
Déclarer return&
return& = md5_ad(md5_rl(md5_ad(md5_ad(a&,q&),md5_ad(x&,t&)),s&),b&)
return return&
ENDPROC
Proc md5_ff
Paramètres a&,b&,c&,d&,x&,s&,t&
Déclarer return&
return& = md5_cm(((b& & c&) | (md5_tilde(b&) & d&)),a&,b&,x&,s&,t&)
return return&
ENDPROC
Proc md5_gg
Paramètres a&,b&,c&,d&,x&,s&,t&
Déclarer return&
return& = md5_cm((b& & d&) | (c& & md5_tilde(d&)),a&,b&,x&,s&,t&)
return return&
ENDPROC
Proc md5_hh
Paramètres a&,b&,c&,d&,x&,s&,t&
Déclarer return&
return& = md5_cm(xor(xor(b&, c&), d&),a&,b&,x&,s&,t&)
return return&
ENDPROC
Proc md5_ii
Paramètres a&,b&,c&,d&,x&,s&,t&
Déclarer return&
return& = md5_cm(XOR(c&, (b& | md5_tilde(d&))),a&,b&,x&,s&,t&)
return return&
ENDPROC
Proc md5_sb
Paramètres x$
Déclarer i&, nblk&, return&
nblk& = ((len(x$) + 8) >> 6) + 1
Whileloop 0, (nblk&*16 - 1)
i& = &loop
md5_x&[i&] = 0
Endwhile
Whileloop 0, (len(x$) - 1)
i& = &loop
md5_x&[i& >> 2] = md5_x&[i& >> 2] | (ord(Mid $(x$,i&+1,1)) << ((i& MOD 4)*8))
Endwhile
inc i&
md5_x&[i& >> 2] = md5_x&[i& >> 2] | ($80 << (((i&) MOD 4)*8))
md5_x&[nblk&*16-2] = len(x$)*8
return& = nblk&*16
return return&
ENDPROC
Proc md5
parameters inputString$
declare a&,b&,c&,d&,olda&,oldb&,oldc&,oldd&,i&,lenx&
md5_hc$ = "0123456789abcdef"
lenx& = md5_sb(inputString$)
'messagebox str$(lenx& ),»,0
a& = 1732584193
b& = -271733879
c& = -1732584194
d& = 271733878
' messagebox str$(lenx&),»,0
Tandis que i& < lenx&
olda& = a&
oldb& = b&
oldc& = c&
oldd& = d&
a& = md5_ff(a&,b&,c&,d&,md5_x&[i& + 0], 7, -680876936)
d& = md5_ff(d&,a&,b&,c&,md5_x&[i& + 1],12, -389564586)
c& = md5_ff(c&,d&,a&,b&,md5_x&[i& + 2],17, 606105819)
b& = md5_ff(b&,c&,d&,a&,md5_x&[i& + 3],22,-1044525330)
a& = md5_ff(a&,b&,c&,d&,md5_x&[i& + 4], 7, -176418897)
d& = md5_ff(d&,a&,b&,c&,md5_x&[i& + 5],12, 1200080426)
c& = md5_ff(c&,d&,a&,b&,md5_x&[i& + 6],17,-1473231341)
b& = md5_ff(b&,c&,d&,a&,md5_x&[i& + 7],22, -45705983)
a& = md5_ff(a&,b&,c&,d&,md5_x&[i& + 8], 7, 1770035416)
d& = md5_ff(d&,a&,b&,c&,md5_x&[i& + 9],12,-1958414417)
c& = md5_ff(c&,d&,a&,b&,md5_x&[i& + 10],17, -42063)
b& = md5_ff(b&,c&,d&,a&,md5_x&[i& + 11],22,-1990404162)
a& = md5_ff(a&,b&,c&,d&,md5_x&[i& + 12], 7, 1804603682)
d& = md5_ff(d&,a&,b&,c&,md5_x&[i& + 13],12, -40341101)
c& = md5_ff(c&,d&,a&,b&,md5_x&[i& + 14],17,-1502002290)
b& = md5_ff(b&,c&,d&,a&,md5_x&[i& + 15],22, 1236535329)
a& = md5_gg(a&,b&,c&,d&,md5_x&[i& + 1], 5, -165796510)
d& = md5_gg(d&,a&,b&,c&,md5_x&[i& + 6], 9,-1069501632)
c& = md5_gg(c&,d&,a&,b&,md5_x&[i& + 11],14, 643717713)
b& = md5_gg(b&,c&,d&,a&,md5_x&[i& + 0],20, -373897302)
a& = md5_gg(a&,b&,c&,d&,md5_x&[i& + 5], 5, -701558691)
d& = md5_gg(d&,a&,b&,c&,md5_x&[i& + 10], 9, 38016083)
c& = md5_gg(c&,d&,a&,b&,md5_x&[i& + 15],14, -660478335)
b& = md5_gg(b&,c&,d&,a&,md5_x&[i& + 4],20, -405537848)
a& = md5_gg(a&,b&,c&,d&,md5_x&[i& + 9], 5, 568446438)
d& = md5_gg(d&,a&,b&,c&,md5_x&[i& + 14], 9,-1019803690)
c& = md5_gg(c&,d&,a&,b&,md5_x&[i& + 3],14, -187363961)
b& = md5_gg(b&,c&,d&,a&,md5_x&[i& + 8],20, 1163531501)
a& = md5_gg(a&,b&,c&,d&,md5_x&[i& + 13], 5,-1444681467)
d& = md5_gg(d&,a&,b&,c&,md5_x&[i& + 2], 9, -51403784)
c& = md5_gg(c&,d&,a&,b&,md5_x&[i& + 7],14, 1735328473)
b& = md5_gg(b&,c&,d&,a&,md5_x&[i& + 12],20,-1926607734)
a& = md5_hh(a&,b&,c&,d&,md5_x&[i& + 5], 4, -378558)
d& = md5_hh(d&,a&,b&,c&,md5_x&[i& + 8],11,-2022574463)
c& = md5_hh(c&,d&,a&,b&,md5_x&[i& + 11],16, 1839030562)
b& = md5_hh(b&,c&,d&,a&,md5_x&[i& + 14],23, -35309556)
a& = md5_hh(a&,b&,c&,d&,md5_x&[i& + 1], 4,-1530992060)
d& = md5_hh(d&,a&,b&,c&,md5_x&[i& + 4],11, 1272893353)
c& = md5_hh(c&,d&,a&,b&,md5_x&[i& + 7],16, -155497632)
b& = md5_hh(b&,c&,d&,a&,md5_x&[i& + 10],23,-1094730640)
a& = md5_hh(a&,b&,c&,d&,md5_x&[i& + 13], 4, 681279174)
d& = md5_hh(d&,a&,b&,c&,md5_x&[i& + 0],11, -358537222)
c& = md5_hh(c&,d&,a&,b&,md5_x&[i& + 3],16, -722521979)
b& = md5_hh(b&,c&,d&,a&,md5_x&[i& + 6],23, 76029189)
a& = md5_hh(a&,b&,c&,d&,md5_x&[i& + 9], 4, -640364487)
d& = md5_hh(d&,a&,b&,c&,md5_x&[i& + 12],11, -421815835)
c& = md5_hh(c&,d&,a&,b&,md5_x&[i& + 15],16, 530742520)
b& = md5_hh(b&,c&,d&,a&,md5_x&[i& + 2],23, -995338651)
a& = md5_ii(a&,b&,c&,d&,md5_x&[i& + 0], 6, -198630844)
d& = md5_ii(d&,a&,b&,c&,md5_x&[i& + 7],10, 1126891415)
c& = md5_ii(c&,d&,a&,b&,md5_x&[i& + 14],15,-1416354905)
b& = md5_ii(b&,c&,d&,a&,md5_x&[i& + 5],21, -57434055)
a& = md5_ii(a&,b&,c&,d&,md5_x&[i& + 12], 6, 1700485571)
d& = md5_ii(d&,a&,b&,c&,md5_x&[i& + 3],10,-1894986606)
c& = md5_ii(c&,d&,a&,b&,md5_x&[i& + 10],15, -1051523)
b& = md5_ii(b&,c&,d&,a&,md5_x&[i& + 1],21,-2054922799)
a& = md5_ii(a&,b&,c&,d&,md5_x&[i& + 8], 6, 1873313359)
d& = md5_ii(d&,a&,b&,c&,md5_x&[i& + 15],10, -30611744)
c& = md5_ii(c&,d&,a&,b&,md5_x&[i& + 6],15,-1560198380)
b& = md5_ii(b&,c&,d&,a&,md5_x&[i& + 13],21, 1309151649)
a& = md5_ii(a&,b&,c&,d&,md5_x&[i& + 4], 6, -145523070)
d& = md5_ii(d&,a&,b&,c&,md5_x&[i& + 11],10,-1120210379)
c& = md5_ii(c&,d&,a&,b&,md5_x&[i& + 2],15, 718787259)
b& = md5_ii(b&,c&,d&,a&,md5_x&[i& + 9],21, -343485551)
a& = md5_ad(a&,olda&)
b& = md5_ad(b&,oldb&)
c& = md5_ad(c&,oldc&)
d& = md5_ad(d&,oldd&)
i& = i& + 16
Endwhile
Retour (md5_rh(a&) + md5_rh(b&) + md5_rh(c&) + md5_rh(d&))
ENDPROC
cls
declare time&
time& = &gettickcount
imprimer "Hallo monde: "+md5("Hallo Welt")
imprimer "ÄÖÜ: "+md5(Utf8Encode("ÄÖÜ"))
imprimer (&gettickcount-time&)
waitkey
end
|
| | | | |
| | Sven Bader | Tricolore encore la fois aktualisiert. qui DLL ist maintenant plus rapide et verarbeitet Umlaute etc. korrekt. |
| | | | |
| | Sven Bader | j'étais encore la fois tour et habe qui DLL aktualisiert. c'est maintenant possible, Fichiers trop vérifier. cela eignet sich, um beispielsweise Manipulationen ou bien sonstige Beschädigungen à Programmdateien trop vérifier, peux mais un peu dauern.
declare hDll&, text$
let hDll& = @UseDll("md5.dll")
ImportFunc(hDll&,"md5", "md5DLL")
ImportFunc(hDll&,"md5_file", "md5_fileDLL")
Proc md5
Paramètres inputstring$
Déclarer target#
Faible target#, 33
md5DLL(Addr(inputstring$), target#)
Retour string$(target#,0)
ENDPROC
Proc md5_file
Paramètres inputstring$
Déclarer target#
Faible target#, 33
md5_fileDLL(Addr(inputstring$), target#)
Retour string$(target#,0)
ENDPROC
Cls
declare time&
time& = &gettickcount
Imprimer "a) Zeichenkette \qtest\q:"
Imprimer "098f6bcd4621d373cade4e832627b4f6"
Imprimer md5("test")
Imprimer »
Imprimer "b) Dossier md5.dll:"
Imprimer "fa7a65f6042653776b524d829e5aef2b"
Imprimer md5_file("md5.dll")
Imprimer »
Imprimer "c) 1024 Leerzeichen:"
Imprimer "10801b757893f9edbff42cd92fdd406a"
Imprimer md5(space$(1024))
Imprimer »
Imprimer str$(int(&gettickcount-time&)) + "ms"
Waitinput
FreeDll hDll&
Fin
|
| | | | |
| | Georg Teles | Nabend,
pour Dateiprüfung peux Du eventuell qui Funktion MapFileAndCheckSum verwenden:
ou bien ici [...] habe Je l' Voir le texte source posté, comment dans Windows cet Funktion berechnet, ici qui blanke Code (dauert aussi beim Effectuer, comme nProc fonctionne es cependant aussi chez grand Fichiers jusqu'à 2 Gb relativ vite, qui Dossier muss comme Ganzes hineingelesen volonté, eignet sich alors pour Fichiers, qui pas entpackt volonté doit comme Bsp., cela était mon intention autrefois pour Manipulationsschutz bzw. CheckSumme dans mon Archivierer):
Set("FileMode",0)
Assign #1,file$
OpenRW #1
BlockRead(#1,ber#,0,size&)
cr2& = cr2(ber#,size&)
Fermer #1
nProc cr2
Paramètres ber#,ps&
Déclarer s&,res&
s& = 0
res& = 0
Si ps& MOD 2 = 0
s& = (ps&\2)-1
D'autre
s& = (ps&\2)
EndIf
WhileLoop 0,s&
res& = res&+word(ber#,&loop*2)
Si res& > 65534
res& = (res&-65535)
Endif
Endwhile
res& = (res&+ps&)
Retour res&
ENDPROC
Grüße Georg |
| | | | |
| | Sven Bader | allô Georg,
qui MapFileAndCheckSumA Funktion ist intéressant et vite genug. qui 32 Bits laisser sich bien comme Integer enlever, qui MD5 Prüfsummen de 128 Bit schleift on plutôt la fois comme String avec, qui sommes ensuite mais aussi sûrement nie doppelt.
qui Entwicklung qui DLL était ausnahmsweise la fois pas aus Eigenbedarf, je hatte simple seulement Amusement daran 2 Gb serait je avec cela maintenant pas vérifier mais inzwischen aller ca. 10 MB pro seconde, qui MapFileAndCheckSumA ist là etwa 10x plus rapide, hat mais aussi moins trop 1faire.
peux du mir dire, welchem Standard deine cr2 Funktion ou bien qui MapFileAndCheckSum avons? je konnte qui Ergebnisse pas validieren, un CRC32 bzw 16 scheint es pas trop son.
Grüße Sven |
| | | | |
| | Georg Teles | Hi Sven,
gute Frage, je peux seulement soviel dire, dass cet Funktion une "Restwert" des WORD (2 Bytes) zur Dateigröße addiert, cela Ergebnis ist ensuite qui Checksumme:
WORD 1 et WORD 2 qui Dossier volonté Addiert (alors erste 2 Bytes avec den prochain 2 Bytes), sollte qui Wert juste bzw. sur 65.535 betragen (Max. Wert des WORD), wird cette abgezogen.
trop diesem reste wird cela prochain WORD (2 Bytes) addiert et wieder verglichen et abgezogen, jusqu'à cela Dateiende erreicht ist ... zum Schluss wird dem Ergebnis, alors dem RestWORD, qui Dateigröße addiert. cela Ergebnis ist ensuite qui somme des RestWORD et qui Dateigröße.
le son MS wurde cet Fuktion vers Manipulation ausführbarer Fichiers entwickelt, sodass qui CheckSumme direct dans den En-tête qui EXE Dossier geschrieben wird (beim Kompilieren).
Bedeutet, si on une EXE Dossier avec cette Fuktion abfragt et cet im En-tête qui CheckSumme besitzt, wird cet Fuktion la valeur simple auslesen et ausgeben (bzw. beim Effectuer avec qui Dossier selbst comparer, HeadSum avec CheckSum, si manipuliert wurde) ... si le EXE Dossier aucun CheckSumme besitzt, wird cet berechnet, un comparaison et une annonce bzgl. Manipulation entfällt.
cet Funktion peux on mais aussi sur alle Fichiers anwenden, là qui Berechnung assez vite allez trotz großer Fichiers.
So gesehen hat cet Funktion aucun Norm nehme je à.
Grüße Georg |
| | | | |
|
Zur DLLOptions du sujet | 2.678 Views |
Themeninformationencet Thema hat 2 participant: |