2017-10-19 4 views
0

16 진수 문자열을 유니 코드 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

제목의 일부 케이스와 문법 오류를 수리. 다시 추가 한 것으로 보이므로 수리했습니다. 그것을 되돌리지 마십시오. 자원 봉사자 편집자의 개량이 여러분에게 유리합니다. – halfer

+0

[답변으로 문제가 해결되면이를 수락해야합니다.] (https://stackoverflow.com/help/someone-answers) 답변으로 "감사합니다"를 추가하거나 "* (해결 된 문제) *"를 추가하지 마십시오. "제목에. –

답변

2

C- 문자열은 null로 끝나야합니다. ch은 아닙니다.

char ch[3] = { 0 }; 

및 널 (NULL) 종료를 추가 :

3 개 문자로 정의 그것은 @dda처럼 보이는

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