OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4422|回复: 2

汉字显示 c936

[复制链接]

7

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
146
金钱
146
注册时间
2012-11-13
在线时间
12 小时
发表于 2013-12-19 17:02:43 | 显示全部楼层 |阅读模式
原子大哥,看到汉字显示一章的时候,遇到了下面的问题,查看资料,还是没有理解明白,希望原子大哥帮帮忙,给小弟指导指导,下面红色的部分的思路,是个什么原理?先谢谢原子大哥了!

WCHAR ff_convert ( /* Converted code, 0 means conversion error */
WCHAR src, /* Character code to be converted */
UINT dir /* 0: Unicode to OEMCP, 1: OEMCP to Unicode */
)
{
const WCHAR *p;
WCHAR c;
int i, n, li, hi;


if (src < 0x80) { /* ASCII */
c = src;
} else {
if (dir) { /* OEMCP to unicode */
p = oem2uni;
hi = sizeof(oem2uni) / 4 - 1;  //这里为什么除于4,是不是OEMCP占用2个字节,Unicode2占用个字节,他们算作一个整体?
} else { /* Unicode to OEMCP */
p = uni2oem;
hi = sizeof(uni2oem) / 4 - 1;
}
li = 0;
for (n = 16; n; n--) {    //这里n为什么等于16,二分法查找的话,能查遍所有的数组元素吗?这个16是怎么来的?我感觉n=15也可行,但不太确定,
i = li + (hi - li) / 2;
if (src == p[i * 2]) break;//为什么要i *2 ,一直没有看明白?
if (src > p[i * 2])
li = i;
else
hi = i;
}
c = n ? p[i * 2 + 1] : 0;
}

return c;
}  
 
if (src < 0x80)c = src;//ASCII,直接不用转换.
else 
{
  if(dir) //GBK 2 UNICODE
{
gbk2uni_offset=ftinfo.ugbksize/2;  
}else //UNICODE 2 GBK  
{   
gbk2uni_offset=0; //为什么这里是0?是不是不进行UNICODE 2 GBK  ?
}    
/* Unicode to OEMCP */
hi=ftinfo.ugbksize/2;//对半开.
hi =hi / 4 - 1;
li = 0;
for (n = 16; n; n--)
{
i = li + (hi - li) / 2;
SPI_Flash_Read((u8*)&t,ftinfo.ugbkaddr+i*4+gbk2uni_offset,4);//读出4个字节  //"ftinfo.ugbkaddr+i*4+gbk2uni_offset",这句话的含义没有理解?具体为什么要i*4?
if (src == t[0]) break;
if (src > t[0])li = i;  
else hi = i;    
}
c = n ? t[1] : 0;      
}
return c;
}
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-12-20 00:04:31 | 显示全部楼层
hi是取数组的一半
sizeof(oem2uni)=87172,也就是数组oem2uni的大小是:87172.
数组是u16类型的,也就是数组总共有:43586个元素.
而数组的特点是每2个元素构成一一对应关系,所以是4个字节为一个组.
也就是43586/2=21793个组

数组最后一对是2个0,无用,直接可以去掉一个组,这样刚好是21793-1=21792个组,偶数方便后续计算.

实际上,只有21792个组,2 的15次方等于32768,足够表示了,这里用15也不会出错,但是作者可能考虑到后续扩展,可能就设置为16了.可以表示65536这么大了.
乘以2很好理解啊,p是u16的数组,但是这个数组是每2个元素一组,所以必须乘以2.
ftinfo.ugbksize包括了UNI2GBK和GBK2UNI,两个数组!所以要一个是从0开始,另外一个是从ftinfo.ugbksize/2开始.
还是一样,4个字节为一组.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
146
金钱
146
注册时间
2012-11-13
在线时间
12 小时
 楼主| 发表于 2013-12-20 12:49:07 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
非常感谢原子大哥,都这么晚了,还帮我回帖解答问题,真是个好人啊,真心的感激和佩服!原子大哥注意身体,不要太晚了!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-17 13:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表