博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
字符串超长导致emWin卡死
阅读量:5172 次
发布时间:2019-06-13

本文共 951 字,大约阅读时间需要 3 分钟。

故障现象:

         使用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个字节填入结束符。

 

转载于:https://www.cnblogs.com/heart-flying/p/9849958.html

你可能感兴趣的文章
Arduino 报错总结
查看>>
树莓派Android Things物联网开发:树莓派GPIO引脚图
查看>>
矩阵快速幂---BestCoder Round#8 1002
查看>>
Hadoop HBase概念学习系列之HBase里的宽表设计概念(表设计)(二十七)
查看>>
awk变量
查看>>
mysql_对于DQL 的简单举例
查看>>
35. Search Insert Position(C++)
查看>>
[毕业生的商业软件开发之路]C#异常处理
查看>>
有关快速幂取模
查看>>
NOI2018垫底记
查看>>
注意java的对象引用
查看>>
C++ 面向对象 类成员函数this指针
查看>>
NSPredicate的使用,超级强大
查看>>
自动分割mp3等音频视频文件的脚本
查看>>
判断字符串是否为空的注意事项
查看>>
布兰诗歌
查看>>
(转)Tomcat 8 安装和配置、优化
查看>>
(转)Linxu磁盘体系知识介绍及磁盘介绍
查看>>
跨域问题整理
查看>>
[Linux]文件浏览
查看>>