字符串超長致使emWin卡死

故障現象:緩存

         使用emWin的機器上有包括中文、英文、俄文等十幾種語言。測試發現保加利亞語有一個界面會偶發的卡死故障,其餘語言不會。測試

 

緣由分析:編碼

         emWin文字控件有25個字節的緩存控件,第25個字節固定爲結束符。要顯示的字符串字節長度若是在24個字節之內就能夠完整顯示,若是超過24個字節就只截取前24個字節顯示。緩存的首地址以指針形式傳給emWin,emWin依據UTF-8編碼規則解析顯示字符,直到碰到結束符才中止。指針

 

         全部字符串採用UTF-8編碼,下面是UTF-8編碼介紹:內存

UTF-8是一種變長字節編碼方式。對於某一個字符的UTF-8編碼,若是隻有一個字節則其最高二進制位爲0;若是是多字節,其第一個字節從最高位開始,連續的二進制位值爲1的個數決定了其編碼的位數,其他各字節均以10開頭。UTF-8最多可用到6個字節。 
如表: 
1字節 0xxxxxxx 
2字節 110xxxxx 10xxxxxx 
3字節 1110xxxx 10xxxxxx 10xxxxxx 
4字節 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 
5字節 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 
6字節 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx字符串

 

         分析卡死界面保加利亞語和其餘語言的不一樣點,發現保加利亞語有多個字符串超長,而其餘語言沒有。字符編碼

         打印超長字符的控件緩存中的數據,發現第24和第25個字節以下:亂碼

110xxxxx 00000000二進制

emWin解析到第24個字節時,發現110開頭就認爲第24個和第25個字節共同組成一個字符編碼(固然顯示出來的是亂碼),也就是說emWin沒有把第25個字節當作是結束符,而後一直在內存中讀下去而致使卡死。數據

 

解決辦法:

         取字符串時,先判斷一下24字節最多能存放多少個字符的完整編碼,好比某個保加利亞語字符串前10個字符的編碼佔23個字節,前11個字符編碼佔25個字節,那麼就將前23個字節存入空間緩存中,第24個字節和25個字節填入結束符。

相關文章
相關標籤/搜索