Seite 4 von 7
Re: Geschwindigkeit
Verfasst: 10.12.2012 19:26
von lite
Danke Matbal für deine Funktion.
Jetzt hab ich noch eine Bitte.
Ich würde gerne eine Stringkette in den Speicher schreiben, aber nicht als Strings,
sondern als Hexwerte. Meine Funktion klappt, nur ist sie sehr langsam. z.B bei über 100 000 Zeichen. da dauert es einige Sekunden.
Hier für Unicode:
Code: Alles auswählen
String$="78DAA5975758135A97862345A922BD0A28BD86167A11104"
datalen=Len(String$)
*memdata = AllocateMemory(datalen)
y=0
For x=0 To datalen Step 2
value=Val("$"+Mid(String$,(x+1),2))
PokeB(*memdata+y,value)
y+1
Next
weiss jemand wie man sowas viel schneller lösen kann ?
Grüße
Lite
Re: Geschwindigkeit
Verfasst: 10.12.2012 19:52
von NicTheQuick
So sollte es schnell genug sein:
Code: Alles auswählen
; Hex-String, der umgerechnet in einen Speicherbereich übertragen
; werden soll.
String$ = "78DAA5975758135A97862345A922BD0A28BD86167A11104"
; Berechne die Länge des Strings.
datalen = Len(String$)
; Alloziere halb so viel Speicher wie der String lange ist,
; da zwei Hexzeichen ein Byte ausmachen
*memdata = AllocateMemory(datalen / 2)
; Definiere einen Pointer um über den String zu iterieren
; und einen für *memdata
Define v.i, *c.Character, *m.Ascii
; Setze die Pointer auf den Anfang des Strings und von *memdata
*c.Character = @String$
*m.Ascii = *memdata
; Iteriere so lange zeichenweise über den String bis das terminierende
; Nullbyte erreicht ist
While *c\c
; a) Nimm den ASCII-Wert des Hexzeichens an der aktuellen Position
; im String mittels *c\c und subtrahiere den ASCII-Wert des Zeichens
; 0 um die Ziffern 0 bis 9 auf ihre entsprechenden Zahlwerte zu
; mappen.
*m\a = *c\c - '0'
; b) War das Zeichen im String keine Zahl, sondern ein Buchstabe,
; zieh entsprechend des ASCII-Wert von A ab und addiere 10,
; damit die Buchstaben A-F auf die Werte 10 bis 15 gemappt werden.
If *c\c >= 'A'
*m\a = *c\c - 'A' + 10
EndIf
; c) Gehe im String um ein Zeichen weiter, in dem der Pointer
; um die Länge eines Zeichens inkrementiert wird.
*c + SizeOf(Character)
; Wurde das Ende des Strings schon erreich? Falls ja, beende die Schleife.
If *c\c = 0 : Break : EndIf
; Multipliziere den eben berechneten Wert mit 16 (Linksshift um 4
; ist das selbe). Damit ist das höherwertige Hexzeichen fertig
; berechnet.
*m\a << 4
; Berechne jetzt das zweite Hexzeichen, das ein Byte ausmacht.
; siehe a)
v = *c\c - '0'
; siehe b)
If *c\c >= 'A'
v = *c\c - 'A' + 10
EndIf
; siehe c)
*c + SizeOf(Character)
; Addiere das niederwertige Hexzeichen zu dem höherwertigen. Damit
; sind nun zwei Hexzeichen zu einem Byte umgerechnet worden.
*m\a + v
; Gehe im Zielspeicherbereich *memdata um ein Byte weiter.
*m + SizeOf(Ascii)
Wend
; Gib den Speicherbereich als String aus.
Debug PeekS(*memdata)
///Edit:
Code auf Wunsch von 7x7 nachträglich kommentiert.
Re: Geschwindigkeit
Verfasst: 10.12.2012 20:11
von lite
@Nic
Vielen Dank, das ist sehr beeindruckend.
Obwohl dein Code viel länger ist, ist er schneller.
Was bremst in meinen Code ?
Grüße
Lite
Re: Geschwindigkeit
Verfasst: 10.12.2012 20:14
von STARGÅTE
In deinem Code benutzt du Umwandlungsfunktionen von String nach Zahl, sowas und arbeiten mit Strings ist immer langsammer, als direkt im Speicher zu arbeiten wie es NicTheQuick macht.
Re: Geschwindigkeit
Verfasst: 10.12.2012 20:48
von NicknameFJ
Hallo Lite,
Ich gehe mal davon aus, dass Du noch Anfänger in Sachen Programmierung bist. Du wirst es noch lernen aber
lite hat geschrieben:
Obwohl dein Code viel länger ist, ist er schneller.
Grüße
Lite
das eine hat mit dem anderen nichts, rein gar nichts zu tun.
NicknameFJ
Re: Geschwindigkeit
Verfasst: 10.12.2012 21:34
von lite
Hallo
Denke, als Anfänger würd ich mich nicht bezeichnen.
Hab vor 27 Jahren in Assembler auf C64 und später auf Amiga programmiert.
Dazwischen waren einige Jahre Pause. Seit 2006 wieder mit au3 eingestiegen.
Seit September 2012 bin ich PB Neuling.
Versuche mich momentan darin, die ganze Breite der Sprache kennenzulernen.
Grüße
Lite
Re: Geschwindigkeit
Verfasst: 11.12.2012 10:51
von 7x7
Mein lieber NicTheQuick, dein Versuch zu helfen in allen Ehren...aber dieses kryptische Code-Gewurschtle ohne erklärende Kommentare, ist - wie man an der Reaktion auch erkennen kann - für den Fragesteller im Erkenntnis-Bezug völlig nutzlos.
(siehe meine Signatur)
Re: Geschwindigkeit
Verfasst: 11.12.2012 16:32
von NicTheQuick
7x7 hat geschrieben:Mein lieber NicTheQuick, dein Versuch zu helfen in allen Ehren...aber dieses kryptische Code-Gewurschtle ohne erklärende Kommentare, ist - wie man an der Reaktion auch erkennen kann - für den Fragesteller im Erkenntnis-Bezug völlig nutzlos.
(siehe meine Signatur)
Ja, Kommentare sind immer schöner, bedeutet aber nicht gleich, dass etwas Müll ist. Das ist höchstens deine Meinung. Bei komplexen Sachen kommentiere ich gerne meinen Code, aber sowas hier ist ja noch leicht zu überblicken, wenn man weiß, was Pointer in PB sind. Andernfalls steht es jedem frei Fragen dazu zu stellen.
Aber wenn du es nicht verstehst, kann ich meinen Code gerne noch für dich kommentieren. Also?
Re: Geschwindigkeit
Verfasst: 11.12.2012 17:32
von 7x7
NicTheQuick hat geschrieben:...kann ich meinen Code gerne noch für dich kommentieren. Also?
Gerne!

Re: Geschwindigkeit
Verfasst: 11.12.2012 17:40
von ts-soft
Der entsprechende "Basic" Code steht doch direkt darüber!
Wer das dann nicht versteht, hat die Sache mit den Pointern
noch nicht verstanden und dies zu Eklären ist in einem Forum-
thread wohl kaum möglich, dafür bedarf es eines Tutorials.
7x7 wunsch ist also eigentlich eher nicht umsetzbar, abgesehen
von ein paar belanglosen Kommentaren, die dann aber nichts
bringen.
Yust my two cents