Schnelles Konvertieren von Hex-Nibbles in Character
Verfasst: 03.09.2013 03:13
Hi liebe Leutz,
ich schreibe gerade einen Parser wo ich möglichst flott Escape-Sequenzen - genauer "\u[Hexwert]" und "\x[Hexwert]" - ersetzen will. Mit ein bisschen Hirnschmalz habe ich das ganze ohne Sprünge hinbekommen und zwei Makros draus geschustert. Diese wollte ich hiermit zum einen der PB-Gemeinde zur Verfügung stellen und zum anderen fragen was die "Vollprofies" hier davon halten, d.h. ob jemand z.B. Fehler oder Optimierungsmöglichkeiten sieht.
Der Testcode stellt übrigens nicht meinen Parser dar, sondern ist wirklich nur ein Testcode!
Für korrekte Ergebnisse bitte als Unicode-Executeable kompilieren!
ich schreibe gerade einen Parser wo ich möglichst flott Escape-Sequenzen - genauer "\u[Hexwert]" und "\x[Hexwert]" - ersetzen will. Mit ein bisschen Hirnschmalz habe ich das ganze ohne Sprünge hinbekommen und zwei Makros draus geschustert. Diese wollte ich hiermit zum einen der PB-Gemeinde zur Verfügung stellen und zum anderen fragen was die "Vollprofies" hier davon halten, d.h. ob jemand z.B. Fehler oder Optimierungsmöglichkeiten sieht.
Der Testcode stellt übrigens nicht meinen Parser dar, sondern ist wirklich nur ein Testcode!

Für korrekte Ergebnisse bitte als Unicode-Executeable kompilieren!
Code: Alles auswählen
Macro NyblCharsToUnicodeChar(n3, n2, n1, n0)
(((n3)&$F|((n3)&$40)>>3+(n3)>>6)<<12|((n2)&$F|((n2)&$40)>>3+(n2)>>6)<<8|((n1)&$F|((n1)&$40)>>3+(n1)>>6)<<4|((n0)&$F|((n0)&$40)>>3+(n0)>>6))
EndMacro
Macro NyblCharsToAsciiChar(n1, n0)
(((n1)&$F|((n1)&$40)>>3+(n1)>>6)<<4|((n0)&$F|((n0)&$40)>>3+(n0)>>6))
EndMacro
; ##### TEST-CODE #####
EnableExplicit
Structure CharacterArray
c.c[0]
EndStructure
Define a$ = "blablabla \u00D6 trulalala \u00C4 fideralala" ; <- \u#### = C-Escape-Sequenz für Unicode-Zeichen
Define b$ = Space(Len(a$))
Define *a.CharacterArray = @a$
Define *b.Character = @b$
Define i, check
While *a\c
If *a\c = '\' And *a\c[1] = 'u'
check = 0
For i = 2 To 5
Select *a\c[i] | $20
Case '0' To '9', 'a' To 'f'
check + 1
Default
Break
EndSelect
Next
If check = 4
*b\c = NyblCharsToUnicodeChar(*a\c[2],*a\c[3],*a\c[4],*a\c[5])
*a + SizeOf(Character)*5
EndIf
Else
*b\c = *a\c
EndIf
*a + SizeOf(Character)
*b + SizeOf(Character)
Wend
*b\c = #NUL
Debug b$