Vai al contenuto

Composizione stringa con valore di 64 bytes in esadecimale

Home Forum Informazioni ambiente di sviluppo LogicLab Composizione stringa con valore di 64 bytes in esadecimale

Stai visualizzando 4 post - dal 1 a 4 (di 4 totali)
  • Autore
    Post
  • #82940
    Anonimo
    Inattivo

    In un mio progetto ho una funzione in cui concateno in una stringa in formato esadecimale il valore di 64 bytes, l’algoritmo che ho utilizzato è questo:

        FOR i:=0 TO 63 BY 1 DO
            Result:=CONCAT(TO_STRING(Result), TO_STRING(CCArrivato[i]));
        END_FOR;

    Con la versione 9 di LogicLab  non avevo problemi, con la versione 10 di LogicLab compilando mi da questo errore.

    error G0033: TO_STRING => Invalid data type

    Come posso risolvere ?

    #82946
    Sergio Bertana
    Amministratore del forum

    I puntatori sono la causa maggiore di crash dei programmi, un puntatore “impazzito” può fare davvero grossi danni in un programma andando a sovrascrivere locazioni di memoria con dati errati. Quindi può essere che la nuova versione di LogicLab abbia introdotto controlli più restrittivi sul tipo dati nell’utilizzo dei puntatori. Generando errori e/o warning nel caso di incongruenza.

    Ora vista la tua richiesta ho realizzato il progranma StrConcat che credo si aesplicativo:

    PROGRAM StrConcat
    VAR
        i : UDINT; (* Auxiliary counter *)
        HexString : STRING[ 256 ]; (* Hexadecimal string *)
        AsciiString : STRING[ 256 ]; (* Ascii string *)
        CCArrivato : ARRAY[0..64] OF BYTE;
    END_VAR
    
        CCArrivato[0]:=16#48; //H
        CCArrivato[1]:=16#65; //e
        CCArrivato[2]:=16#6C; //l
        CCArrivato[3]:=16#6C; //l
        CCArrivato[4]:=16#6F; //0
        CCArrivato[5]:=16#21; //!
        HexString:=''; //Hexadecimal string
    
        // Stringa composta da 64 byte esadecimali...
        // HexString:='48656C6C6F210000 ... 0000'
    
        FOR i:=0 TO 63 DO
            HexString:=CONCAT(HexString, TO_STRING(CCArrivato[i]));
        END_FOR;
    
        // Stringa ascii...
        // AsciiString:='Hello!'
    
        eTO_JUNK(Sysmemmove(ADR(AsciiString), ADR(CCArrivato), 64));
    
    // [End of file]

    Come vedi HexString contiene il valore Hex di CCArrivato, mentre AsciiString contiene esattamente il carattere ascii corrispondente. Siccome eseguo un CONCATdevo entrare nel loop di concatenazione con HexString inizializzato.

    Il tuo errore è avere eseguito un cast di Result a STRING, TO_STRING(Result), Result è già di tipo stringa. Sinceramente non ho verificato se nella vecchia versione di LogicLab questo era tollerato, da quanto dici sembrerebbe di si.

    #82952
    Roberto
    Partecipante

    Ma non ho capito ultima istruzione a cosa serve

    eTO_JUNK(Sysmemmove(ADR(AsciiString), ADR(CCArrivato), 64));
    #82964
    Sergio Bertana
    Amministratore del forum

    E’ un esempio per evidenziare la differenza tra l’utilizzo del cast TO_STRING e la semplice copia.

    Con TO_STRING  viene ritornato il valore esadecimale (con 2 caratteri ascii) del carattere ascii, mentre con la copia si copia il carattere. In pratica se verifichiamo la lunghezza delle due stringhe:

        StrLgt[0]:=LEN(AsciiString);
        StrLgt[1]:=LEN(HexString);
    • StrLgt[0]=6, La stringa ascii ha lunghezza 6 caratteri.
    • StrLgt[1]=70, La stringa hex ha lunghezza 70 caratteri. I primi 6 (La stringa “Hello!”) convertita in hex ha lunghezza 12 caratteri (2 per ogni carattere ascii), poi seguono i 64-6=58 caratteri presenti nei bytes di CCArrivato che esendo tutti azzerati producono 58 caratteri ascii “0” (Hex code 30).

    Ricordati che le stringhe vanno sempre terminate con il “tappo” valore esadecimale 0. Se esegui il programma con le stringhe inizializzate a 0 ti troverai automaticamente già il codice tappo al termine. Se invece le stringhe sono già valorizzate potresti avere problemi, quindi ti consiglio di terminarle per sicurezza:

        TO_JUNK(eSetBYTE(eTO_POINTER(ADR(AsciiString))+LEN(AsciiString), 16#00));
        TO_JUNK(eSetBYTE(eTO_POINTER(ADR(HexString))+LEN(HexString), 16#00));
Stai visualizzando 4 post - dal 1 a 4 (di 4 totali)
  • Devi essere connesso per rispondere a questo topic.