2017-10-19 22 views
0

我試圖編寫一個函數,它將一串十六進制值轉換爲Unicode UTF-8字符的字符串。當這個函數被調用一次時,一切都很好。但是當函數連續調用兩次相同或不同的參數時,兩個輸出字符串都是沒有意義的。在Arduino IDE中,爲什麼函數的第二次調用會改變之前的調用結果?

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() { 
    // 
} 

如果我評論了第二個電話,在串口監視器輸出:

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

這是正確的。如果第二個呼叫未被註釋,則串行監視器中的輸出爲:

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

它看起來像@dda的稱號修復了一些情況下,和語法錯誤。你似乎又把它們加回來了,所以我修好了它。請不要回復 - 志願編輯的一些改進對您有利。 – halfer

+0

[如果答案解決了您的問題,您應該接受它。](https://stackoverflow.com/help/someone-answers)不要添加「謝謝」作爲答案或添加「*(已解決)* 「的標題。 –

回答

2

C字符串需要以空字符終止。您的ch不是。

把它定義爲3個字符:

char ch[3] = { 0 }; 

,並添加一個空終止:

ch[0] = c0; 
ch[1] = c1; 
ch[2] = 0; 
相關問題