Das ist die "alte" Variante.
Die "neuere" ist nur auf github, nicht in der Download-Datei
Ansonsten funzt das einwandfrei!
Das ist die "alte" Variante.
Die "neuere" ist nur auf github, nicht in der Download-Datei
Ansonsten funzt das einwandfrei!
Zuhause funzt es bei mir auch. Code oben aktualisiert.
Die "neuere" ist nur auf github, nicht in der Download-Datei
Tatsache! Bin noch neu in dem Metier - hab Releases bisher nicht genutzt. Muss halt dran denken das immer mit zu aktualisieren.
Sollte nun oben sein.
Kleine Abfrage: Aktuell ist in $mReturn.ptr der Pointer zum Code-Anfang. In $mReturn.Funcs stehen dann die einzelnen Offsets der Funktionen. Das hat zur Folge, dass man bei DllCallAdress beides für den Pointer braucht. Also z.B. sowas: DllCallAddress("double", $mCode.ptr + $mCode.Funcs["doubleIt"], "DOUBLE", 21.0)
Wenn man in .Funcs jedoch stattdessen die absoluten Pointer auf die Funktionen stehen hätte, dann könnte man sich das addieren sparen.
Ich denke daran, statt .Funcs zwei Maps zu verwenden: .FuncOffsets und .FuncPtr . Dann wäre der DllCallAddress-Aufruf schlanker und weniger fehleranfällig.
Was meint ihr dazu?
Was meint ihr dazu?
Why not. Können wir gerne testen.
Apropos testen:
#AutoIt3Wrapper_UseX64=y
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
#include "..\JIT.au3"
AutoItSetOption("GUIOnEventMode", 1)
Global $hCRT = DllCall("kernel32.dll", "handle", "LoadLibraryW", "wstr", "ucrtbase.dll")[0]
Global $pSin = DllCall("kernel32.dll", "ptr", "GetProcAddress", "handle", $hCRT, "str", "sin")[0]
Global $pCos = DllCall("kernel32.dll", "ptr", "GetProcAddress", "handle", $hCRT, "str", "cos")[0]
Global $pPow = DllCall("kernel32.dll", "ptr", "GetProcAddress", "handle", $hCRT, "str", "pow")[0]
If Not $pSin Or Not $pCos Or Not $pPow Then Exit MsgBox(16, "Fehler", "Math-Pointer nicht gefunden!")
Global $sCode = _
'typedef double (*MathFn1)(double);' & @LF & _
'typedef double (*MathFn2)(double, double);' & @LF & _
'CALLCONV void RenderDwitter(unsigned int* ptr, int iW, int iH,' & @LF & _
' MathFn1 fsin, MathFn1 fcos, MathFn2 fpow, double t) {' & @LF & _
' int i, px, py;' & @LF & _
' double y, k, e, d, q, P;' & @LF & _
' int l = 840, l1 = (l >> 1), l2 = (l >> 2);' & @LF & _
' for (i = iW * iH - 1; i--;) ptr[i] = 0xF0202020;' & @LF & _
' for (i = 20000; i-- > 0; ) {' & @LF & _
' y = (double)i / l;' & @LF & _
' k = (4.0 + fsin(y * 2.0 - t) * 3.0) * fcos((double)i / 29.0);' & @LF & _
' e = y / 8.0 - 11.0;' & @LF & _
' d = fpow(k * k + e * e, 0.66);' & @LF & _
' q = fsin(k * 2.0) + 0.3 / k + fsin(y / 25.0) * k * (9.0 + 4.0 * fsin(e * 9.0 - d * 3.0 + t * 2.0));' & @LF & _
' P = d - t;' & @LF & _
' px = (int)(q * fsin(P) + d * 39.0 - l1);' & @LF & _
' py = (int)(q + 30.0 * fcos(P) + l2);' & @LF & _
' if (px >=0 && px < iW && py >=0 && py <iH)' & @LF & _
' ptr[py * iW + px] = 0xB0FFFFFF;' & @LF & _
' }' & @LF & _
'}'
Global $mCode = _JIT_Compile($sCode, (@AutoItX64 ? "-O3 -ffloat-store" : "-Ofast"))
If @error Then Exit MsgBox(16, "Fehler", "Kompilierung fehlgeschlagen")
_GDIPlus_Startup()
Global $iW = 840, $iH = Int($iW * 9 / 16)
Global $pScan0 = DllStructCreate("ulong rgba[" & $iW * $iH & "]")
Global $hBitmap = _GDIPlus_BitmapCreateFromScan0($iW, $iH, $GDIP_PXF32ARGB, $iW * 4, $pScan0)
Global $hGUI = GUICreate("JIT Render https://dwitter.net/d/33997", $iW, $iH)
GUISetState(@SW_SHOW)
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
Global $hGfx = _GDIPlus_GraphicsCreateFromHWND($hGUI)
Global $fT = 0.0, $bExit
Do
DllCallAddress("none", $mCode.ptr + $mCode.Funcs["RenderDwitter"], "ptr", DllStructGetPtr($pScan0), _
"int", $iW, _
"int", $iH, _
"ptr", $pSin, _
"ptr", $pCos, _
"ptr", $pPow, _
"double", $fT)
_GDIPlus_GraphicsDrawImageRect($hGfx, $hBitmap, 0, 0, $iW, $iH)
$fT += 0.05
If $bExit Then ExitLoop
Until Not Sleep(10)
_GDIPlus_GraphicsDispose($hGfx)
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_Shutdown()
_JIT_Free($mCode)
Func _Exit()
$bExit = True
EndFunc ;==>_Exit_About
Alles anzeigen
Das sollte unter x86 und x64 laufen. Bitte mal testen.
Original JS Code:
l = c.width = 840;
for (i = 2e4; i--; )
y = i / l,
k = (4 + S(y * 2 - t) * 3) * C(i / 29),
e = y / 8 - 11,
d = (k * k + e * e)**0.66,
q = S(k * 2) + 0.3 / k + S(y / 25) * k * (9 + 4 * S(e * 9 - d * 3 + t * 2)),
P = d - t,
px = q * S(P) + d * 39 - l / 2,
py = q + 30 * C(P) + l / 4,
x.fillRect(px, py, 1, 1)
Alles anzeigen
#include <stdio.h>
#include <string.h>
#include "KeccakHash.h"
__declspec(dllexport) void sha3_256(const unsigned char *input, size_t length, unsigned char *output) {
Keccak_HashInstance hashInstance;
Keccak_HashInitialize_SHA3_256(&hashInstance); // Initialize SHA3-256
Keccak_HashUpdate(&hashInstance, input, length); // Process the input data
Keccak_HashFinal(&hashInstance, output); // Get the final hash
}
Ich möchte, dass dieser Code (oder ein funktionierender Code) „sha3_256” hasht.
Ich brauche ihn, um die Datei „SQLite.zip” von ihrer Website zu hashen.
Kann das jemand von Ihnen erledigen? 👼
Apropos testen:
Grandios! Die Lösung um eben doch sin/cos etc. im C-Code zu verwenden ist ja mal clever!
Damit erweitert sich die Einsatzmöglichkeit des ganzen enorm! Danke für diesen Ansatz.
Ich möchte, dass dieser Code (oder ein funktionierender Code) „sha3_256” hasht.
Ich brauche ihn, um die Datei „SQLite.zip” von ihrer Website zu hashen.
Kann das jemand von Ihnen erledigen? 👼
Das geht zumindest nicht mit dem gezeigten Code-Schnipsel. Siehe Abschnitt "Limitations" der Readme zur JIT.au3:
ZitatLimitations
This UDF is designed for small, self-contained code snippets - not for full C projects.
- No #include support - the C standard library is not available. There is no linker; the code must be fully self-contained.
- No math.h functions - sin(), cos(), pow() etc. require libm which is not linked. Some GCC __builtin_* functions work as inline alternatives (see examples/example_builtins.au3).
- Internet required for compilation - use _JIT_LoadBinary to work offline after the first compile.
- Single translation unit - all code must be in one string, no multi-file compilation.
Es braucht also einen Code der keine #includes nutzt und spezielle Funktionen evtl. ebenso sparsam einsetzt (wie man das umgehen kann hat UEZ soeben gezeigt).
Ich möchte, dass dieser Code (oder ein funktionierender Code) „sha3_256” hasht.
Na gut ich habe mal eine Variante gefunden die damit funktionieren könnte (C-Code im Anhang).
Bei der Umsetzung sind mir aber ein paar Erweiterungen für die JIT.au3 aufgefallen, die hierfür benötigt werden.
Es ist also mindestens die neue Version v0.2.1 (siehe Link im ersten Post) zu verwenden.
Dann kann man sich damit eine sha3_256-Funktion in AutoIt folgendermaßen bauen:
#include "JIT.au3"
; hash a string
Global $sString = "Hallo Welt"
Global $bHash = _sha3_256($sString)
ConsoleWrite('sha3_256("' & $sString & '") = ' & StringTrimLeft($bHash, 2) & @CRLF)
; hash a file
Global $hFile = FileOpen(@ScriptDir & "\sqlite-preprocessed-3520000.zip", 16)
Global $bFile = FileRead($hFile)
FileClose($hFile)
Global $bHash = _sha3_256($bFile)
ConsoleWrite('sha3_256("sqlite-preprocessed-3520000.zip") = ' & StringTrimLeft($bHash, 2) & @CRLF)
Func _sha3_256($sString)
;~ Local Static $mCode = _JIT_Compile(FileRead('sha3_256_portable.c'))
Local Static $mCode = _JIT_LoadBinary(@AutoItX64 _
? '{"b":"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","f":{"keccak_f1600":0,"sha3_256":688}}' _
: '{"b":"VYnlV1aNcCBTg+TwgexQAQAAiTQkjbDoAAAAx0QkCAAAAACJdCQMLo20JgAAAACQMdLzD28EEPMPb2QQKPMPb6wQoAAAAPMPb0wQUPMPb3QQeGYP78RmD+/FZg/vzmYP78EPKUQUMIPCEIP6IHXD8w9vVCQ4i0ggiUQkBItYJDNISGYPb8JmD2/aM1hMM0hwZg9z8wEzWHQziJgAAAAzmJwAAABmD3PQPzOIwAAAAIt0JDBmD+vDi3wkNIlMJFAzmMQAAACJTCQoicGJXCRU8w9vTCRIifIPpP4BiVwkLA+k1wEzdCRIjVwkYPMPflwkKA8WXCQwZg/vwzN8JEwPKUQkYGYPb8FmD3PxAWYPc9A/ibQkgAAAAGYP68GJvCSEAAAAZg/vwg8pRCRwZg9vCzHS8w9vBBFmD+/BDxEEEYPCKIH6yAAAAHXog8MQjZQkgAAAAIPBEDnTddGLHCSLTCQMKdmJ2oPhCHQRixwkMTONUygxewQ7VCQMdBaLTCQMMTIxegQxcigxeiyDwlA5ynXuiUQkEL64BQAAMcmLRCQQx0QkKAAAAACNHAmJdCQYjQTIiUwkFIlEJCSJdCQguM3MzMyLfCQk9+OJ0IPi/MHoAgHCidgp0ItXBI00gItEJCiNDAaLdCQgiweJ14lMJByLDonGD6X30+b2wSB0BIn3Mfb32Q+t0NPq9sEgdASJ0DHSi0wkHAnwg0QkKAEJ+oNEJCQog8MDiYTMiAAAAItEJCiDRCQgFImUzIwAAACD+AUPhXf///+LTCQUi3QkGIPBAYPGBIP5BQ+FPv///4tEJBDHRCQgAAAAAI28JIgAAACLdCQEiUQkHItMJCC4zczMzI1ZAoPBAffhiUwkIInQg+L8wegCAcKJyCnQjYzEiAAAALjNzMzM9+OJTCQkidCD4vzB6AIBwinTjYTciAAAADHbiUQkKItEJCSLTCQoi1QYBIsEGPfS99AjVBkEIwQZM1QfBDMEH4kEHolUHgSDwyiB+8gAAAB1zYPHCIPGCIN8JCAFD4Vu////i3QkCItEJByLDPU4BgAAixz1PAYAAIPGATEIMVgEiXQkCIP+GA+F+fz//41l9FteX13DkFW5MgAAADHAieVXVlOD5PCB7GABAACLXRCLdQyNvCSYAAAA86uB+4cAAAAPhsMAAACJdCQMjYaIAAAAiV0QiUQkBDHALo20JgAAAACNdCYAiUQkCDH2Mf8x2+skLo20JgAAAAAujbQmAAAAAC6NtCYAAAAALo20JgAAAACNdCYAi0QkDI0M3QAAAAAx0g+2BBgPpcLT4PbBIHQEicIxwIPDAQnGCdeD+wh11YtEJAiDRCQMCDG0BJgAAACLdCQEMbwEnAAAAIPACDl0JAx1gYtdEI2EJJgAAADo4vv//4t0JAyB64gAAACB+4cAAAAPhz3///+NVCQQuSIAAAAxwInX86uF23QiideD+wRyB4nZwekC86UxyfbDAg+FPAEAAPbDAQ+FJwEAAMZEHBAGMcCAjCSXAAAAgIlUJAyNdCYAiUQkCDH2Mf8x2+s0Lo20JgAAAAAujbQmAAAAAC6NtCYAAAAALo20JgAAAAAujbQmAAAAAC6NtCYAAAAAjXQmAItEJAyNDN0AAAAAMdIPtgQYD6XC0+D2wSB0BInCMcCDwwEJxgnXg/sIddWLRCQIg0QkDAgxtASYAAAAjbQkmAAAADG8BJwAAACDwAg7dCQMD4Vq////ifAx2+jh+v//i0UIiUQkCMdEJAwAAAAAi7QcmAAAAIlcJASLvBycAAAAi0QkDIn6jRzFAAAAAInwidnT6g+t+PbDIItcJAwPRcKJwotEJAiIFBiNQwGJRCQMg/gIdcuLXCQEg0QkCAiDwwiD+yB1oI1l9FteX13CDAAPtgQOiAQP6c3+//8Ptwa5AgAAAGaJB/bDAQ+Euf7//+vezMzMzMzMAAAAAAEAAAA+AAAAHAAAABsAAAAkAAAALAAAAAYAAAA3AAAAFAAAAAMAAAAKAAAAKwAAABkAAAAnAAAAKQAAAC0AAAAPAAAAFQAAAAgAAAASAAAAAgAAAD0AAAA4AAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAIKAAAAAAAAAioAAAAAAAIAAgACAAAAAgIuAAAAAAAAAAQAAgAAAAACBgACAAAAAgAmAAAAAAACAigAAAAAAAACIAAAAAAAAAAmAAIAAAAAACgAAgAAAAACLgACAAAAAAIsAAAAAAACAiYAAAAAAAIADgAAAAAAAgAKAAAAAAACAgAAAAAAAAIAKgAAAAAAAAAoAAIAAAACAgYAAgAAAAICAgAAAAAAAgAEAAIAAAAAACIAAgAAAAIA","f":{"keccak_f1600":0,"sha3_256":832},"r":[407,791,798]}' _
)
Local $tHash = DllStructCreate("byte[32]")
If IsBinary($sString) Then
Local $tBinary = DllStructCreate("byte[" & BinaryLen($sString) & "]")
DllStructSetData($tBinary, 1, $sString)
DllCallAddress("NONE", $mCode.FuncPtr["sha3_256"], _
"STRUCT*", $tHash, _
"STRUCT*", $tBinary, _
"ULONG", BinaryLen($sString))
Else
DllCallAddress("NONE", $mCode.FuncPtr["sha3_256"], _
"STRUCT*", $tHash, _
"STR", $sString, _
"ULONG", StringLen($sString))
EndIf
If @error Then Return SetError(1, @error, Null)
Return DllStructGetData($tHash, 1)
EndFunc
Alles anzeigen
Wunderschön. Danke! 😍