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:
; 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.
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.
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.
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)
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll
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?
NicTheQuick hat geschrieben:...kann ich meinen Code gerne noch für dich kommentieren. Also?
Gerne!
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll
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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.