Hallo Stefan,
bei der ersten Routine scheint es sich um die Berechnung der NMEA Prüfsumme zu handeln. Diese Berechnung ist recht einfach und innerhalb von VFP m.E. erheblich übersichtlicher :)
* // NMEA Checksumme berechnen
LOCAL lcString as String
lcString = [$GPGGA,162045,5058.809,N,00647.103,E,1,03,2.5,63.1,M,47.2,M,,*79]
CLEAR
? lcString
? GetNMEACheckSum( lcString )
FUNCTION GetNMEACheckSum as String
LPARAMETERS vNMEAString as String
LOCAL lcString as String, liCheck as Integer, i as Integer
lcString = STREXTRACT( vNMEAString , [$] , [*] , 1 )
liCheck = 0
FOR i = 1 TO LEN( lcString )
liCheck = BITXOR( liCheck , ASC( SUBSTR( lcString , i , 1 ) ) )
ENDFOR
RETURN RIGHT(TRANSFORM( liCheck , [@0] ) , 2 )
ENDFUNC
Die Berechnung beruht letztlich auf einer byteweisen XOR Verknüpfung des kompletten NMEA Strings wobei der erste XOR mit 0 verknüpft wird.
Dein zweites Script invertiert letztlich A nach Z, B nach Y, C nach X usw. Ein solcher Algorithmus kann in VFP wie folgt aussehen:
CLEAR
lcTest = [Aa Bb Cc Dd Ee Ff Gg Hh Ii Jj Kk Ll Mm Nn Oo Pp Qq Rr Ss Tt Uu Vv Ww Xx Yy Zz]
?InvertString( lcTest )
FUNCTION InvertString as String
LPARAMETERS vString as String
LOCAL i as Integer, liAsc as Integer, lcReplace as String
FOR i = 1 TO LEN( vString )
liAsc = ASC( SUBSTR( vString , i , 1 ) )
DO CASE
* // A-Z
CASE BETWEEN( liAsc , 65 , 90 )
lcReplace = CHR( ABS( 25 - ( liAsc - 65 ) ) + 65 )
* // a-z
CASE BETWEEN( liAsc , 97 , 122 )
lcReplace = CHR( ABS( 25 - ( liAsc - 97 ) ) + 97 )
* // nichts davon
OTHERWISE
lcReplace = SUBSTR( vString , i , 1 )
ENDCASE
vString = STUFF( vString , i , 1 , lcReplace )
ENDFOR
RETURN vString
ENDFUNC
Gruss / Best regards -Tom 010101100100011001010000011110000101001001101111011000110110101101110011