shell编程/字库裁剪(1)
我写这个帖子的意图,在于三个:
1.用代码生成代码的思维。
2.shell编程的思路。
3.裁剪字库的具体程序。
我打算分为三节来说:
第一节讲裁剪裁剪词库的意义以及使用场合;
第二节讲如何用shell来解决这个问题;
第三节讲如何测试结果。
很多带有点阵液晶的硬件项目可能需要显示汉字、ASCII字符,有的廉价的液晶里没有字库,有的液晶里带有了字库但可能需要其他字体的支持。这种时候我们就需要使用外置的字库了。一般一个字库需要几百K大小,当然对于有外置flash的情况下根本不算什么,但有些时候我们在设计硬件的时候出于硬件成本、PCB尺寸等因素考虑,并不会采用外部存储,现在的嵌入式处理器公司都会在SOC上给一定的flash,足够你正常的编程使用,比如我们熟悉的STM32系列,它由ST公司(意法半导体)出品的基于ARM的SOC,有着自己的相对统一的开发库,可选器件品类繁多,是裸机运行的首选。
SOC上的flash一般尺寸相对很小,几百K的字库很可能超标,甚至本身就没这么大。那么在这种情况下,如果还想使用字库,只好对字库进行裁剪,这也是笔者这个主题的背景情况。当然,也会有FPGA来控制液晶、VGA等情况的时候也需要裁剪字库,但不在我这个的考虑范围内,我这个题材只是针对C语言编程。
我们来试想一下,对于ASCII码,即便是16X8的字库,总共也就2k不到,基本可以完全忍受下来,所以主要考虑裁剪的是汉字。如果是完整的汉字字库,那么显示汉字可以直接根据GB2312码来算出二进制编码,这个可以在baidu里面搜索GB2312字库的偏移,里面可以查到很多文章可以说明GB2312字库的偏移,细节不在这里讨论。直接写结果,GB2312的编码为两个字节,假设某个汉字的GB2312编码第一个字节为GBH,第二个字节为GBL,并且每个汉字字体在字库中的大小为s,那么这个汉字在字库中的偏移为
offset = [ (GBH - 161) * 94 + (GBL - 161) ] * s
一般使用的是16X16字库,那么s=16*16/8=32,当然也有使用其他大小,比如12X12,那么s=12*12/8=18。
如果要用到繁体字,那么可以采用GBK编码和GBK字库,公式类似,本文只考虑GB2312。
在具体应用中,可以对于所有使用的汉字按照编码大小顺序提取,生成一个数组;然后有两种解决方法:
1.再建立一个所使用汉字编码大小顺序的有序数组,在寻找汉字字体的时候采用二分查找法找到汉字编码在数组中的偏移ofs,从而知道所选字体在字体数组中的偏移ofs/2*s。
2.把程序中的汉字都替换成偏移,这可以换来更快的运行速度(虽然只快了那么微小的一点点)和更快的存储,但最后是以牺牲程序可读性为前提的,所以一般情况下不建议如此,代码不仅仅是给机器读也是要给人读的。
shell编程/字库裁剪(1)的更多相关文章
- shell编程/字库裁剪(2)——编程过程
版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/7704085.html 作者:窗户 Q ...
- shell编程/字库裁剪(1)——想法
版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/7679024.html 作者:窗户 Q ...
- shell编程/字库裁剪(3)——验证
版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/7712496.html 作者:窗户 Q ...
- Linux学习笔记(17) Shell编程之基础
1. 正则表达式 (1) 正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配.grep.awk.sed等命令可以支持正则表达式:通配符用来匹配符合条件的文件名,通配符是完全匹配.ls.find ...
- shell编程:定义简单标准命令集
shell是用户操作接口的意思,操作系统运行起来后都会给用户提供一个操作界面,这个界面就叫shell,用户可以通过shell来调用操作系统内部的复杂实现,而shell编程就是在shell层次上进行编程 ...
- Linux Shell编程入门
从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁.用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操 ...
- Shell编程菜鸟基础入门笔记
Shell编程基础入门 1.shell格式:例 shell脚本开发习惯 1.指定解释器 #!/bin/bash 2.脚本开头加版权等信息如:#DATE:时间,#author(作者)#mail: ...
- Linux_10------Linux之shell编程------变量
.-9 vim num.sh #! /bin/bash num1=$1 num2=$2 sum=$(($num1+$num2)) #变量sum是num1和num2的综合 echo $sum 执行 ./ ...
- 需要交互的shell编程——EOF(转载)
在shell编程中,”EOF“通常与”<<“结合使用,“<<EOF“表示后续的输入作为子命令或子shell的输入,直到遇到”EOF“, 再次返回到主调shell,可将其理解为分 ...
随机推荐
- 201521123017 《Java程序设计》第5周学习总结
1. 本周学习总结 2. 书面作业 1.代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改正该错误.并分析输出结果. 1.2 ...
- 201521123062《Java程序设计》第5周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 1.2 可选:使用常规方法总结其他上课内容. 2. 书面作业 1.代码阅读:Child压缩包内源代码 1.1 com.pare ...
- 201521123075 《Java程序设计》第2周学习总结
1. 本周学习总结 各种数据类型,运算符,表达式的使用: 字符串String类; 对数组对象和字符串对象的运用. 2. 书面作业 1.使用Eclipse关联jdk源代码,并查看String对象的源代码 ...
- 201521123063 《Java程序设计》 第11周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. (1)多线程的冲突 当我们不想一种资源被同时使用,导致最后结果不一致,解决方法: 使用synchronized标记 ...
- 201521123069 《Java程序设计》 第10周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. (1)我们可以利用堆栈追踪来获得异常发生的根源(堆栈追踪信息最顶层). (2)自定义异常:不是由Java系统 ...
- 201521123078 《Java程序设计》第十三周学习总结
1. 本周学习总结 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu.edu.cn,分析返回结果有何不同?为什么会有这样的不同? 查询Ip地址 ...
- Jquery第三篇【AJAX 相关的API】
前言 前面我们已经学了讲解了Jquery的选择器,关于DOM 的API还有事件的API.本博文需要讲解Jquery对AJAX的支持- 我们在开始使用JavaScript学习AJAX的时候,创建异步对象 ...
- 鸟哥Linux学习笔记05
1, 文件系统通常会将 权限与属性放置到inode中,至于实际数据则放置到data block块中.另外还有一个超级块(superblock)会记录整个文件系统的整体内容,包括ino ...
- 排查Linux机器是否已经被入侵
随着开源产品的越来越盛行,作为一个Linux运维工程师,能够清晰地鉴别异常机器是否已经被入侵了显得至关重要,个人结合自己的工作经历,整理了几种常见的机器被黑情况供参考 背景信息:以下情况是在CentO ...
- Struts框架2
1.框架:是一个半成品,可以在其基础上在次开发. 2.struts2框架:它是一个web层使用的mvc框架. 3.struts2核心 1.struts2核心 2.xwork核心 4.struts2入门 ...