2017-10-19 20 views
0

J'ai essayé d'écrire une fonction qui convertit une chaîne de valeurs hexadécimales en une chaîne de caractères Unicode UTF-8. Lorsque cette fonction est appelée une fois, tout va bien. Mais lorsque la fonction est appelée deux fois de suite avec des arguments identiques ou différents, les deux chaînes de sortie n'ont aucun sens.Dans l'IDE Arduino, pourquoi le deuxième appel d'une fonction modifie-t-il les résultats d'appel précédents?

void HEX2String(String* HEXstr, String* str) { 
    String s2 = "", s3 = ""; 
    long c, c1, c0; 
    char ch[2] = { 0 }; 
    for (int i = 0; i <= HEXstr->length() - 4; i = i + 4) { 
    s2 = HEXstr->substring(i, i + 1) + "x" + HEXstr->substring(i + 1, i + 4); 
    c = (hex2long(&s2)); 
    if (c < 255) 
     *str += String((char)c); 
    else { 
     c1 = (128 + (c & B111111)); 
     c0 = (192 + (c >> 6)); 
     ch[1] = c1; 
     ch[0] = c0; 
     str->concat(ch); 
    } 
    } 
} 

String str1 = "0628064700200646062706450020062E062F0627000A0633064406270645000A064806310648062F0020062806470020063306CC0633062A06450020062A064806330637"; 
String str = "0628064700200646062706450020062E062F0627000A0633064406270645000A064806310648062F0020062806470020063306CC0633062A06450020062A064806330637000A00730061006C0061006D0020006200610072002000730068006F006D0061"; 
String msg = ""; 

void setup() { 
    Serial.begin(9600); 
    //First call 
    HEX2String(&str, &msg); 
    Serial.println(msg); 
    msg = ""; 
    //Second call 
    HEX2String(&str1, &msg); 
    Serial.println(msg); 
} 

void main() { 
    // 
} 

Si je commente le deuxième appel, la sortie du moniteur série est:

سلام 
ورود به سیستم توسط 
salam bar shoma 

Il est exact. Si le second appel n'est pas commenté, la sortie dans le moniteur série est:

ب⸮⸮ه⸮⸮ ن⸮⸮ا⸮⸮م⸮⸮ خ⸮⸮د⸮⸮ا⸮⸮ 
س⸮⸮ل⸮⸮ا⸮⸮م⸮⸮ 
و⸮⸮ر⸮⸮و⸮⸮د⸮⸮ ب⸮⸮ه⸮⸮ س⸮⸮ی⸮⸮س⸮⸮ت⸮⸮م⸮⸮ ت⸮⸮و⸮⸮س⸮⸮ط⸮⸮ 
salam bar shomaب⸮⸮ه⸮⸮ ن⸮⸮ا⸮⸮م⸮⸮ خ⸮⸮د⸮⸮ا⸮⸮ 
س⸮⸮ل⸮⸮ا⸮⸮م⸮⸮ 
و⸮⸮ر⸮⸮و⸮⸮د⸮⸮ ب⸮⸮ه⸮⸮ س⸮⸮ی⸮⸮س⸮⸮ت⸮⸮م⸮⸮ ت⸮⸮و⸮⸮س⸮⸮ط⸮⸮ 
+0

Il ressemble à @dda réparer quelques erreurs de cas et de grammaire dans le titre. Vous semblez les avoir rajoutés, donc je l'ai réparé. S'il vous plait, ne retournez pas cela - les petites améliorations apportées par les éditeurs bénévoles vous sont favorables. – halfer

+0

[Si une réponse a résolu votre problème, vous devez l'accepter.] (Https://stackoverflow.com/help/someone-answers) N'ajoutez pas de "Merci" comme réponse ou ajoutez "* (Résolu) * "au titre. –

Répondre

2

Les chaînes C doivent être terminées par un caractère nul. Votre ch ne l'est pas.

Définir comme 3 caractères:

char ch[3] = { 0 }; 

et ajoutez une terminaison null:

ch[0] = c0; 
ch[1] = c1; 
ch[2] = 0;