locked
Wäre freundlicher Weise jemand in der Lage mir die folgenden C++ Codes nach VFP zu übersetzen ? RRS feed

  • Frage

  • Guten Tag zusammen,

    ich benötige mal professionelle Hilfe ;-)

    Wäre von de anwesenden hier jemand in der Lage mir die nachfolgenden Sourcen von C++ nach VFP zu übersetzten ?

     

    ***-Listing 1

    C++
    #define NIBBLE2HEX(c) ((c) > 9 ? (c) + 'A' - 10 : (c) + '0')
    // buf is a char[] array which contains the NMEA sentence without trailing
    checksum.
    // E.g. "$FRLIN,,user1,8IVHF" and "*7A" will be added
    // buf_inx is an index to the last free position in the buffer
    int checksum = 0;
    int inx;
    for(inx = 1; inx < buf_inx; inx++)
    {
    checksum ^= buf[inx];
    }
    buf[buf_inx++] = '*';
    buf[buf_inx++] = NIBBLE2HEX((checksum >> 4) & 0xf);
    buf[buf_inx++] = NIBBLE2HEX(checksum & 0xf);

    *** Ende Listing 1

    *** Listing 2

    private string m_InvertString(string strToInvert)
    {
    StringBuilder builder = null;
    if (strToInvert != null)
    {
    builder = new StringBuilder();
    int iLength = strToInvert.Length;
    for (int iIndex = iLength - 1; iIndex >= 0; iIndex--)
    {
    char c = strToInvert[iIndex];
    if (c >= '0' && c <= '9')
    {
    builder.Append((char)(9 - (c - '0') + '0'));
    }
    else if (c >= 'a' && c <= 'z')
    {
    builder.Append((char)(('z' - 'a') - (c - 'a') + 'A'));
    }
    else if (c >= 'A' && c <= 'Z')
    {
    builder.Append((char)(('Z' - 'A') - (c - 'A') + 'a'));
    }
    }
    }
    return builder != null ? builder.ToString() : null;
    }

    *** Ende Listing 2

     

    Das wäre total klasse, ich verstehe von c++ sovie wie ne Kuh vom Tanzen :-)

     

    Grüsse und vorab vielen Dank

    Stefan

    Sonntag, 7. August 2011 10:43

Antworten

  • 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
    Mittwoch, 31. August 2011 11:58