einbinden vom c und c++

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

So wie du das da versuchst sechsrad, funktioniert es bei mir auch nicht ... aber wenn man einen Zeiger (c_float) als 2. Paramter übergibt, dann funktioniert es wie folgt:

cmath.dll

Code: Alles auswählen

#include <math.h>

void mult(float n, float* r) {
  *r=n*3.7;
}

void div(float n, float* r) {
  *r=n/2.3;
}
Und dann einmal den Python-Teil im Interpreter durchgespielt:

Code: Alles auswählen

>>> from ctypes import *
>>> cmath = cdll.LoadLibrary("cmath.dll")
>>> b = c_float(34.3)
>>> r = ct.pointer(c_float())
>>> 
>>> cmath.mult(b,r)
14484904 #<-- das hier, ist eine ähnliche Zahl wie bei dir, vermute das es die Speicheradresse (aber nicht der tatsächliche Wert eben) ist
>>> r.contents
c_float(126.90999603271484)
>>> print r.contents.value
126.909996033
>>> # oder hier mal gerundet auf 2 Nachkommastellen ...
>>> print round(r.contents.value,2)
126.91
Voilla,
>>Masaru<<
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

es funktioniert jetzt ohne ct.

das kommt raus:
126.909996033

danke.
from ctypes import *

f =cdll.LoadLibrary("test.dll")

b=c_float(34.3)
r=pointer(c_float())

f.mult(b,r)

print r.contents.value
Zuletzt geändert von sechsrad am Montag 7. April 2008, 17:09, insgesamt 2-mal geändert.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Mitdenken. Für was könnte "ct" wohl eine Abkürzung sein... ?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

lunar hat geschrieben:Ich bestreite ja nicht, dass Reverse Engineering möglich ist, aber ich bestreite, dass es einfach ist und "recht gut" funktioniert ;) In solche Keygeneratoren und Cracks steckt nämlich verdammt viel Arbeit, und oft braucht es ein paar Monate intensiver Arbeit, bis solche Algorithmen gebrochen sind.
Lies mal den Artikel "Mifare-Funkchip geknackt" in c't 8/2008 (das ist die aktuelle) auf S. 80 durch (kann ich übrigens auch allen anderen empfehlen). Der ist super gemacht und zeigt wie sie Hardware-Reverse-Engineering gemacht haben. Natürlich, das war sicherlich mehr Aufwand als wie das im Artikel klingt, aber trotzdem - mit genügend Motivation (und die kann durchaus gegeben sein, wenn man sieht, wo die Mifare Classic überall eigesetzt wird) ist so etwas durchaus zu schaffen. Klar dass das schon einiges an Vorwissen benötigt, aber das ist nun mal mit allem so :)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

Mitdenken. Für was könnte "ct" wohl eine Abkürzung sein... ?
aha, bei "from ctypes import *" wird dieses "ctypes" automatisch angenommen und es kommt dann die fehlermeldung wenn ich es davor setze und bei "import ctypes" muss ich es jedesmal davorschreiben.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

sechsrad hat geschrieben:aha, bei "from ctypes import *" wird dieses "ctypes" automatisch angenommen und es kommt dann die fehlermeldung wenn ich es davor setze und bei "import ctypes" muss ich es jedesmal davorschreiben.
Ja, daher sollte man es eben nicht machen. Um die Übersicht zu bewahren.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
ne0h
User
Beiträge: 115
Registriert: Samstag 16. Februar 2008, 11:35

Lies mal den Artikel "Mifare-Funkchip geknackt" in c't 8/2008 (das ist die aktuelle) auf S. 80 durch (kann ich übrigens auch allen anderen empfehlen). Der ist super gemacht und zeigt wie sie Hardware-Reverse-Engineering gemacht haben. Natürlich, das war sicherlich mehr Aufwand als wie das im Artikel klingt, aber trotzdem - mit genügend Motivation (und die kann durchaus gegeben sein, wenn man sieht, wo die Mifare Classic überall eigesetzt wird) ist so etwas durchaus zu schaffen. Klar dass das schon einiges an Vorwissen benötigt, aber das ist nun mal mit allem so
Den Artikel habe ich auch zuletzt gelesen, wirklich schön, wie die Jungs dort das Ganze auseinandergenommen haben.


@sechsrad

Sorry, aber Deine ganzen Begriffe sind einfach nur zusammengewürfelt, ich habe auch danach gegoogelt und nichts sinnvolles dazu gefunden.

Des weiteren würde mich mal interessieren, wie Du die Leistung deines Pythoncodes analysiert hast und wie Du feststellst, dass Dein Pythoncode langsamer ist als Deine C-Implementierung ?

Wo genau macht Python denn bei Deinem Projekt schlapp? Hast Du NumPy und andere Möglichkeiten eingesetzt, die auch schon hier gepostet wurden?

Hast Du schon versucht, Deinen Pythoncode zu optimieren?


ne0h
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

Ja, daher sollte man es eben nicht machen. Um die Übersicht zu bewahren.
also mit "import ctypes"

mfg
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

sechsrad hat geschrieben:
Ja, daher sollte man es eben nicht machen. Um die Übersicht zu bewahren.
also mit "import ctypes"
Richtig. Du kannst dem zwar einen Alias geben, aber mir fällt kein brauchenares Kürzel ein. Alternativ kannst du auch die Namen die du benötigst einzeln importieren, das ist im Fall von ctypes wohl auch ein brauchbarer Ansatz. Also mit ``from ctypes import pointer, cdll`` usw.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
lunar

Leonidas hat geschrieben:
lunar hat geschrieben:Ich bestreite ja nicht, dass Reverse Engineering möglich ist, aber ich bestreite, dass es einfach ist und "recht gut" funktioniert ;) In solche Keygeneratoren und Cracks steckt nämlich verdammt viel Arbeit, und oft braucht es ein paar Monate intensiver Arbeit, bis solche Algorithmen gebrochen sind.
Lies mal den Artikel "Mifare-Funkchip geknackt" in c't 8/2008 (das ist die aktuelle) auf S. 80 durch (kann ich übrigens auch allen anderen empfehlen). Der ist super gemacht und zeigt wie sie Hardware-Reverse-Engineering gemacht haben. Natürlich, das war sicherlich mehr Aufwand als wie das im Artikel klingt, aber trotzdem - mit genügend Motivation (und die kann durchaus gegeben sein, wenn man sieht, wo die Mifare Classic überall eigesetzt wird) ist so etwas durchaus zu schaffen. Klar dass das schon einiges an Vorwissen benötigt, aber das ist nun mal mit allem so :)
Was anderes habe ich ja auch gar nicht gesagt ;) Allerdings sind Vorwissen und Motivation für viele ausreichend große Hürden, vor allem, wenn das benötigte Vorwissen sehr umfangreich ist, und die Motivation lang anhalten muss ;) Beides ist beim Reverse Engineering eher Regel denn Ausnahme... insofern kann man schon davon sprechen, dass Reverse Engineering von Binärkompilaten wesentlich aufwendiger ist als das von Byte-Code. Nichts anderes wollte ich sagen ;)

Also lassen wir das jetzt, dass ist eh OT ;)
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

ctypes
wie kann ich die namen von ctypes oder auch anderen modulen zb auflisten um sie mal kennenzulernen?
mfg
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

``dir(ctypes)``.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

sechsrad hat geschrieben:
ctypes
wie kann ich die namen von ctypes oder auch anderen modulen zb auflisten um sie mal kennenzulernen?
mfg
Das Python Tutorial schadet nie.
( http://docs.python.org/tut/tut.html )

Aber ich verrate es dir ausnahmsweise mal direkt:

Code: Alles auswählen

>>> dir(ctypes)
['ARRAY', 'ArgumentError', 'Array', 'BigEndianStructure', 'CDLL', 'CFUNCTYPE', 'DEFAULT_MODE', 'DllCanUnloadNow', 'DllGetClassObject', 'FormatError', 'GetLastError', 'HRESULT', 'LibraryLoader', 'LittleEndianStructure', 'OleDLL', 'POINTER', 'PYFUNCTYPE', 'PyDLL', 'RTLD_GLOBAL', 'RTLD_LOCAL', 'SetPointerType', 'Structure', 'Union', 'WINFUNCTYPE', 'WinDLL', 'WinError', '_CFuncPtr', '_FUNCFLAG_CDECL', '_FUNCFLAG_PYTHONAPI', '_FUNCFLAG_STDCALL', '_Pointer', '_SimpleCData', '__builtins__', '__doc__', '__file__', '__name__', '__path__', '__version__', '_c_functype_cache', '_calcsize', '_cast', '_cast_addr', '_check_HRESULT', '_check_size', '_ctypes_version', '_dlopen',  ........]
>>> x = "lol"
>>> dir(x)
[ ..... 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', ..... ]
>>> 
PS: hätte ich noch einmal mehr in diesem Thread das Wort "(nicht)fachleuten" gelesen, hätte ich nicht geantwortet.
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

also ich progge mit dem editor "drpython"

wenn ich den befehl dort eingebe und mit "run" starten möchte, passiert nichts.
wie kann ich es dort auflisten?


mfg
Zuletzt geändert von sechsrad am Montag 7. April 2008, 20:00, insgesamt 1-mal geändert.
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

die Ausgabe kommt natürlich nur im interaktiven Interpreter.
Wenn du es in einer .py Datei schreibst muß ein ``print`` davor.

Ist das die Lösung?
ne0h
User
Beiträge: 115
Registriert: Samstag 16. Februar 2008, 11:35

Du musst in der Shell Python starten (also in den interaktiven Modus wechseln) und dort dir(ctypes) eingeben.


ne0h
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

So ist das eben mit Nichtfachleuten...
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

werde für so etwas den "idle" nehmen.

mfg
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

na siehste, geht doch. das kommt davon wenn man mit nichtfachleuten redet. ;-)

Sorry, aber den konnte ich mir jetzt nicht verkneifen.
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

also geht auch nicht.

wenn ich dir() eingebe werden 3 namen aufgelistet.
bei dir(ctypes) kommt "NameError: name 'ctypes' is not defined"
obwohl ich ja eben mit der "ctypes" gearbeitet habe.
bei "dir(math)" kommt die gleiche fehlermeldung, obwohl ich eben gerade sinus getestet hatte mit import math.

hmmm.

mfg
Antworten