shell编程/字库裁剪(2)——编程过程
版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖。如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/7704085.html 作者:窗户 QQ:6679072 E-mail:6679072@qq.com
之所以想用shell实现,是因为shell是UNIX/LINUX的工作语言,可以实现很强大的功能,所以借此话题顺带讲一下shell编程的思路。可是现实是,很多人在搞linux的同时,却写不出一个稍微复杂那么一点点的shell程序,甚至包括一些运维人员。在chinaunix的shell版里,基本会成周期性的问一些相同的简单问题,我们称之位月经贴。我实在不知道,难道是这个世界变化了,我们以前所遵守的一些东西已经过时了?从我的经验来,学习一些shell还是很有必要的,我验证很多时候都使用shell,因为方便。
shell是胶水语言,里面按理可以用其他所有的程序做零件,但传统上来说,我们还是使用POSIX下定义的一些工具,这些算传统的工具。就嵌入的编程语言来说,awk/sed/bc这些算是shell“本家”的,而python/perl这些,不太像是shell本家的。
我们构思我们的shell的功能,首先要准备的基本材料有如下:
(1)GB2312字库,字库的字体尺寸;
(2)ASCII字库,字库的字体尺寸;
(3)一个文本文件,里面包含了所有要使用的汉字。
以上的准备材料应该已经基本充足,但有的时候会要涉及到多种字体乃至多种尺寸,可在本文所给出程序的基础上扩展。另外,第三个文件我当时使用的时候是直接对于显示所用的C语言文件处理所得,截取两个双引号之间的部分即可,之所以不选择C语言文件里所有的GB2312编码汉字,是因为可能会包含注释。
那么处理出来应该是一个完整的C语言文件,我们根据第一节中的讨论,自然也可以想的出来这个C语言文件中包含了:
(1)所有ASCII可见字符的字体数组,编码连续即可。
(2)所用汉字的编码数组,编码从小到大。
(3)所用汉字的字体数字,按照编码从小到大的顺序。
(4)给出一个函数,取给定ASCII的字体的首地址。
(5)给出一个函数,取给定汉字的字体的首地址,使用二分查找法。
其中,(2)、(3)两个数组用结构体的方式合为一个数组,C语言的可读性更强一些。
那么,和其他的编程一样,我们先确定这个程序的框架:
#!/bin/bash #http://www.cnblogs.com/Colin-Cai #ASCII字库文件
ascii_font=ASC16
#ASCII字符高
ascii_height=16
#ASCII字符宽
ascii_width=8
#汉字字库文件
chinese_font=CHS16.FON
#汉字高
chinese_height=16
#汉字宽
chinese_width=16
#算出每个ASCII字符字体字节数
let ascii_bytes=ascii_height*ascii_width/8
#算出每个汉字字体字节数
let chinese_bytes=chinese_height*chinese_width/8
chinese_example=sample.txt code_and_offset()
{
} print_font()
{
} filter()
{
} chinese_font_to_c()
{
} ascII_font()
{
} create_func()
{
} { code_and_offset ${chinese_example}; print_font ${chinese_font} ${chinese_bytes}; } | filter | chinese_font_to_c ${chinese_bytes}
ascII_font ${ascii_font} ${ascii_bytes}
create_func ${ascii_bytes} ${chinese_bytes}
我们选择了16X16的汉字字库以及16X8的ASCII字库。
最开始定义一堆变量,当然,也可以采用命令行的方式,可能更加灵活一些,不过写的复杂了一些。最后三行就是产生C语言代码的,其中第二行是产生ASCII字符字体数组,相对简单一些,最后一行是生成那两个C语言函数,这基本上是C语言是什么样,这个地方就差不多长什么样,当然如果二分法不懂,或者写个半天写不出来,建议应该回头补一补数据结构,它是基础 。
第一行是产生汉字编码、字体数组的,这个过程会比较复杂一些,我希望code_and_offset ${chinese_example}从提取出我所希望的汉字,并且编码从小到大,以便后面处理。比如加入我希望裁剪的汉字文本是“人工智能真厉害”,那么这个的输出应该是
flag 185 164 2259
flag 186 166 2355
flag 192 247 3000
flag 196 220 3349
flag 200 203 3708
flag 213 230 4957
flag 214 199 5020
前面加一个flag是为了和print_font输出区分开来,以便过管道处理的时候可以方便的区分输入的意思。
printt_font是想把整个字库文件变成可见字符,然后切割成一个完整的汉字字体一行。这个用od单条命令就可以很方便的生成如下格式:
...
00 00 18 00 18 00 18 00 18 00 18 00 18 00 18 00 18 00 18 00 18 00 00 00 18 00 18 00 00 00 00 00
00 00 02 40 02 40 02 40 02 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 02 20 02 20 02 20 02 20 3f fc 04 40 04 40 04 40 04 40 3f fc 08 80 08 80 08 80 08 80 00 00
00 00 38 38 10 10 08 20 04 40 02 80 02 80 01 00 01 00 0f e0 01 00 01 00 01 00 01 00 03 80 00 00
00 00 18 04 24 08 24 10 24 20 24 40 24 80 19 00 02 60 04 90 08 90 10 90 20 90 40 90 00 60 00 00
00 00 06 00 09 00 10 80 10 80 09 00 0a 00 04 00 1c 00 22 70 41 20 40 a0 40 44 21 a4 1e 18 00 00
00 00 10 00 10 00 10 00 20 00 20 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 0c 00 10 00 20 00 40 00 40 00 80 00 80 00 80 00 80 00 80 00 80 00 40 00 40 00 20 00 10 00 0c
60 00 10 00 08 00 04 00 04 00 02 00 02 00 02 00 02 00 02 00 02 00 04 00 04 00 08 00 10 00 60 00
00 00 01 00 01 00 01 00 21 08 11 10 09 20 05 40 03 80 02 80 04 40 08 20 10 10 00 00 00 00 00 00
...
然后这两者的输出过一个管道,处理成每一行都是一个不同的所需要的汉字,filter做了这样一个过滤。
185 164 00 00 00 08 7f fc 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01 04 ff fe 00 00 00 00
186 166 02 00 01 00 7f fe 41 02 9f f4 01 00 1f f0 01 00 7f fc 01 00 1f f0 10 10 10 10 10 10 1f f0 10 10
192 247 00 08 3f fc 20 00 20 04 3f fe 22 00 22 08 23 fc 22 08 22 08 22 08 22 08 44 08 44 88 88 50 10 20
196 220 10 80 10 88 24 98 44 a0 fe c0 02 84 7c 84 44 7c 44 00 7c 88 44 98 44 a0 7c c0 44 82 54 82 48 7e
200 203 01 00 01 00 01 00 01 00 01 00 01 00 01 00 02 80 02 80 02 80 04 40 04 40 08 20 10 10 20 0e 40 04
213 230 01 00 01 08 7f fc 01 00 1f f0 10 10 1f f0 10 10 1f f0 10 10 1f f0 10 10 ff fe 08 20 10 18 20 08
214 199 20 00 22 04 3f 7e 48 44 08 44 ff c4 10 44 14 7c 22 44 42 10 9f f8 10 10 1f f0 10 10 1f f0 10 10
最后再过一个管道,生成C语言代码表示为结构体数组。
最近回头再想想管道的思维,觉得这才是一个很关键的分解,mapreduce虽然google已经不太好意思谈它了,我们也未必要觉得这是大数据的经典,一个这么粗糙的模型却被吹了十来年,感觉像浮夸风。但mapreduce这样的思想其实早已伴随我们几十年,其实这里面也有管道流的思想。甚至有次在论坛上看到有人提出,并行基本就两种基本手段,一种流水线,另一种mapreduce,想想似乎也有点道理。
扯远了,先分了块之后,再为每个函数填上代码,反复测试,这也是一个有点复杂的过程,我程序中使用了大量的awk,因为它处理文本的确很方便。代码不重要,过程中的想法才重要。
#!/bin/bash #http://www.cnblogs.com/Colin-Cai #ASCII字库文件
ascii_font=ASC16
#ASCII字符高
ascii_height=16
#ASCII字符宽
ascii_width=8
#汉字字库文件
chinese_font=CHS16.FON
#汉字高
chinese_height=16
#汉字宽
chinese_width=16
#算出每个ASCII字符字体字节数
let ascii_bytes=ascii_height*ascii_width/8
#算出每个汉字字体字节数
let chinese_bytes=chinese_height*chinese_width/8
chinese_example=sample.txt code_and_offset()
{
od -An -v -t u1 $1 | xargs -n 1 | awk '
$1 < 161 { next }
{
GBH = $1
getline
GBL = $1
x = (GBH-161)*94+(GBL-161)
print "flag", GBH, GBL, x
}
' | sort -n -k2 -n -k3 -u
} print_font()
{
od -w$2 -An -v -tx1 $1
} filter()
{
awk 'BEGIN {
i = 0
j = 0
n = 0
}
$1 == "flag" {
GBH[$4] = $2
GBL[$4] = $3
i++
next
}
n in GBH {
print GBH[n], GBL[n], $0
if(++j >= i)
exit(0)
}
{
n++
}
'
} chinese_font_to_c()
{
awk 'BEGIN {
flag = 0
printf("typedef struct{\n\tunsigned char GBH;\n\tunsigned char GBL;\n\tunsigned char font['$1'];\n} chinese_font_t;\n\n");
}
{
if(flag == 0) {
printf("static const chinese_font_t chinese_font[] = {\n")
flag = 1
} else {
printf(",\n")
}
printf("\t{ 0x%x, 0x%x, { ", $1, $2)
printf("0x%s", $3)
for(i=4;i<=NF;i++) {
printf(", 0x%s", $i)
}
printf("}}")
}
END {
printf("\n};\n\n")
}'
} ascII_font()
{
od -w$2 -An -v -tx1 $1 | awk 'BEGIN {
flag = 0;
}
NR>=33&&NR<=127 {
if(flag == 0) {
printf("static const unsigned char ascii_font[] = {\n")
flag = 1
} else {
printf(",\n")
}
printf("\t0x%s", $1)
for(i=2;i<=NF;i++) {
printf(", 0x%s", $i)
}
}
END {
printf("\n};\n\n")
}' } create_func()
{
cat <<EOF
#define NULL ((void*)0)
const unsigned char *find_ascii_font(unsigned char c)
{
if(c<(unsigned char)32 || c>(unsigned char)126)
return NULL;
return ascii_font+(int)(c-32)*$1;
} #define chinese_cnt (sizeof(chinese_font)/sizeof(chinese_font_t))
const unsigned char *find_chinese_font(unsigned char GBH, unsigned char GBL)
{
int x, y, mid;
unsigned short key, key2; key = (unsigned short)GBH<<8;
key |= (unsigned short)GBL;
x = 0;
y = chinese_cnt;
while(x<=y) {
mid = (x+y)/2;
key2 = (unsigned short)chinese_font[mid].GBH<<8;
key2 |= (unsigned short)chinese_font[mid].GBL;
if(key<key2)
y = mid-1;
else if(key>key2)
x = mid+1;
else
return chinese_font[mid].font;
}
return NULL;
} EOF } { code_and_offset ${chinese_example}; print_font ${chinese_font} ${chinese_bytes}; } | filter | chinese_font_to_c ${chinese_bytes}
ascII_font ${ascii_font} ${ascii_bytes}
create_func ${ascii_bytes} ${chinese_bytes}
对于上述“人工智能真厉害”,所生成的C语言文件如下
typedef struct{
unsigned char GBH;
unsigned char GBL;
unsigned char font[];
} chinese_font_t; static const chinese_font_t chinese_font[] = {
{ 0xb9, 0xa4, { 0x00, 0x00, 0x00, 0x08, 0x7f, 0xfc, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x04, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00}},
{ 0xba, 0xa6, { 0x02, 0x00, 0x01, 0x00, 0x7f, 0xfe, 0x41, 0x02, 0x9f, 0xf4, 0x01, 0x00, 0x1f, 0xf0, 0x01, 0x00, 0x7f, 0xfc, 0x01, 0x00, 0x1f, 0xf0, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1f, 0xf0, 0x10, 0x10}},
{ 0xc0, 0xf7, { 0x00, 0x08, 0x3f, 0xfc, 0x20, 0x00, 0x20, 0x04, 0x3f, 0xfe, 0x22, 0x00, 0x22, 0x08, 0x23, 0xfc, 0x22, 0x08, 0x22, 0x08, 0x22, 0x08, 0x22, 0x08, 0x44, 0x08, 0x44, 0x88, 0x88, 0x50, 0x10, 0x20}},
{ 0xc4, 0xdc, { 0x10, 0x80, 0x10, 0x88, 0x24, 0x98, 0x44, 0xa0, 0xfe, 0xc0, 0x02, 0x84, 0x7c, 0x84, 0x44, 0x7c, 0x44, 0x00, 0x7c, 0x88, 0x44, 0x98, 0x44, 0xa0, 0x7c, 0xc0, 0x44, 0x82, 0x54, 0x82, 0x48, 0x7e}},
{ 0xc8, 0xcb, { 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x80, 0x02, 0x80, 0x02, 0x80, 0x04, 0x40, 0x04, 0x40, 0x08, 0x20, 0x10, 0x10, 0x20, 0x0e, 0x40, 0x04}},
{ 0xd5, 0xe6, { 0x01, 0x00, 0x01, 0x08, 0x7f, 0xfc, 0x01, 0x00, 0x1f, 0xf0, 0x10, 0x10, 0x1f, 0xf0, 0x10, 0x10, 0x1f, 0xf0, 0x10, 0x10, 0x1f, 0xf0, 0x10, 0x10, 0xff, 0xfe, 0x08, 0x20, 0x10, 0x18, 0x20, 0x08}},
{ 0xd6, 0xc7, { 0x20, 0x00, 0x22, 0x04, 0x3f, 0x7e, 0x48, 0x44, 0x08, 0x44, 0xff, 0xc4, 0x10, 0x44, 0x14, 0x7c, 0x22, 0x44, 0x42, 0x10, 0x9f, 0xf8, 0x10, 0x10, 0x1f, 0xf0, 0x10, 0x10, 0x1f, 0xf0, 0x10, 0x10}}
}; static const unsigned char ascii_font[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
0x00, 0x66, 0x66, 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x6c, 0x6c, 0xfe, 0x6c, 0x6c, 0x6c, 0xfe, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00,
0x18, 0x18, 0x7c, 0xc6, 0xc2, 0xc0, 0x7c, 0x06, 0x06, 0x86, 0xc6, 0x7c, 0x18, 0x18, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xc2, 0xc6, 0x0c, 0x18, 0x30, 0x60, 0xc6, 0x86, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x76, 0xdc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
0x00, 0x30, 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x30, 0x18, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3c, 0xff, 0x3c, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xd6, 0xd6, 0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x18, 0x38, 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x7c, 0xc6, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x7c, 0xc6, 0x06, 0x06, 0x3c, 0x06, 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x0c, 0x1c, 0x3c, 0x6c, 0xcc, 0xfe, 0x0c, 0x0c, 0x0c, 0x1e, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0xfc, 0x06, 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x38, 0x60, 0xc0, 0xc0, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xfe, 0xc6, 0x06, 0x06, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x06, 0x06, 0x0c, 0x78, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x7c, 0xc6, 0xc6, 0x0c, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xde, 0xde, 0xde, 0xdc, 0xc0, 0x7c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x66, 0x66, 0x66, 0x66, 0xfc, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xc0, 0xc0, 0xc2, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xf8, 0x6c, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6c, 0xf8, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xde, 0xc6, 0xc6, 0x66, 0x3a, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x1e, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xe6, 0x66, 0x66, 0x6c, 0x78, 0x78, 0x6c, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xf0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xc6, 0xee, 0xfe, 0xfe, 0xd6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xd6, 0xde, 0x7c, 0x0c, 0x0e, 0x00, 0x00,
0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x6c, 0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x7c, 0xc6, 0xc6, 0x60, 0x38, 0x0c, 0x06, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x7e, 0x7e, 0x5a, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x6c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xd6, 0xd6, 0xd6, 0xfe, 0xee, 0x6c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xc6, 0xc6, 0x6c, 0x7c, 0x38, 0x38, 0x7c, 0x6c, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xfe, 0xc6, 0x86, 0x0c, 0x18, 0x30, 0x60, 0xc2, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x3c, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0x70, 0x38, 0x1c, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x3c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x3c, 0x00, 0x00, 0x00, 0x00,
0x10, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xe0, 0x60, 0x60, 0x78, 0x6c, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x1c, 0x0c, 0x0c, 0x3c, 0x6c, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0xcc, 0x78, 0x00,
0x00, 0x00, 0xe0, 0x60, 0x60, 0x6c, 0x76, 0x66, 0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x06, 0x06, 0x00, 0x0e, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3c, 0x00,
0x00, 0x00, 0xe0, 0x60, 0x60, 0x66, 0x6c, 0x78, 0x78, 0x6c, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0xfe, 0xd6, 0xd6, 0xd6, 0xd6, 0xc6, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xf0, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0x0c, 0x1e, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x76, 0x66, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x60, 0x38, 0x0c, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x10, 0x30, 0x30, 0xfc, 0x30, 0x30, 0x30, 0x30, 0x36, 0x1c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xd6, 0xd6, 0xd6, 0xfe, 0x6c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x6c, 0x38, 0x38, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0xf8, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xcc, 0x18, 0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x0e, 0x18, 0x18, 0x18, 0x70, 0x18, 0x18, 0x18, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x70, 0x18, 0x18, 0x18, 0x0e, 0x18, 0x18, 0x18, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
}; #define NULL ((void*)0)
const unsigned char *find_ascii_font(unsigned char c)
{
if(c<(unsigned char) || c>(unsigned char))
return NULL;
return ascii_font+(int)(c-)*;
} #define chinese_cnt (sizeof(chinese_font)/sizeof(chinese_font_t))
const unsigned char *find_chinese_font(unsigned char GBH, unsigned char GBL)
{
int x, y, mid;
unsigned short key, key2; key = (unsigned short)GBH<<;
key |= (unsigned short)GBL;
x = ;
y = chinese_cnt;
while(x<=y) {
mid = (x+y)/;
key2 = (unsigned short)chinese_font[mid].GBH<<;
key2 |= (unsigned short)chinese_font[mid].GBL;
if(key<key2)
y = mid-;
else if(key>key2)
x = mid+;
else
return chinese_font[mid].font;
}
return NULL;
}
shell编程/字库裁剪(2)——编程过程的更多相关文章
- shell编程/字库裁剪(1)
我写这个帖子的意图,在于三个: 1.用代码生成代码的思维. 2.shell编程的思路. 3.裁剪字库的具体程序. 我打算分为三节来说: 第一节讲裁剪裁剪词库的意义以及使用场合: 第二节讲如何用shel ...
- shell编程/字库裁剪(3)——验证
版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/7712496.html 作者:窗户 Q ...
- shell编程/字库裁剪(1)——想法
版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/7679024.html 作者:窗户 Q ...
- Shell编程——脚本编写思路与过程
Linux系统Shell编程——脚本编写思路与过程 “ 前段时间有小伙伴问我一些问题,涉及到shell脚本的编写问题,事后,我深入思考了下,实际生产环境的确也会经常用到,因此如何写这个脚本?它的思路在 ...
- linux学习19 shell脚本基础-bash脚本编程基础及配置文件
一.shell脚本编程 1.编程语言的分类,根据运行方式 a.编译运行:源代码 --> 编译器(编译) --> 程序文件 C语言: b.解释运行:源代码 --> 运行时启动解释器,由 ...
- 编写Java程序,用套接字编程模拟实现银行认证过程
需求说明: 某银行一核心服务器部署了一个资金交易来往的系统,为了防止黑客入侵窃取数据,该银行专门开发了一款负责安全认证的智能机器人守护服务器,对外来访问做多重身份认证.现在要求你用套接字编程模拟实现这 ...
- Python黑帽编程2.1 Python编程哲学
Python黑帽编程2.1 Python编程哲学 本节的内容有些趣味性,涉及到很多人为什么会选择Python,为什么会喜欢这门语言.我带大家膜拜下Python作者的Python之禅,然后再来了解下P ...
- Python黑帽编程2.9 面向对象编程
Python黑帽编程2.9 面向对象编程 我个人认为,计算机语言的发展,有两个方向,一个是从低到高的发展过程,在这个过程中,语言的思考和解决问题的方式是面向硬件的.硬件本质上处理的是信号,在此基础上, ...
- 老李推荐:第14章1节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-面向控件编程VS面向坐标编程
老李推荐:第14章1节<MonkeyRunner源码剖析> HierarchyViewer实现原理-面向控件编程VS面向坐标编程 poptest是国内唯一一家培养测试开发工程师的培训机 ...
随机推荐
- 201521123014 《Java程序设计》第5周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 2. 书面作业 Q1. 代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通 ...
- 201521123050《Java程序设计》第1周学习总结
1. 本周学习总结 java至今已经不仅是个程序语言,也代表了解决问题的平台,更代表原厂,各个厂商,社群,开发者与用户沟通的成果.若以程序语言来看待java,正如冰山一角,如此便看不到java身为程序 ...
- Java中如何引入结对编程
引自微信: 很多同学说: 我程序写得好,ACM比赛能得分, 就好了,软件工程讲的那些有用么? 有些学校的 <软件工程>课,由于要求太简单,反而不能说明软件工程的价值. 其实好办, 让学生结 ...
- Git与码云(Git@OSC)入门-如何在实验室和宿舍同步你的代码(1)
0.几个基本概念 本地仓库:本机上某个存放代码的仓库. 远程仓库:码云服务器上的代码仓库. 重要提醒:当我们在本地操作(新增.删除.修改)文件.目录时,并将其提交(commit),就是提交到了本地仓库 ...
- 201521123054 《Java程序设计》 第十周学习总结
1. 本周学习总结 2. 书面作业 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 4-2中finally中捕获异常需要注意什么? 无论是否抛出异常,也无论从什么地方返回,finally语句 ...
- 201521123066 《Java程序设计》第十四周学习总结
1. 本周学习总结 2. 书面作业 1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自己的学号.姓名) 在自己建立的数据库上执行常见SQL语句(截图) - ...
- 控制结构(4) 局部化(localization)
// 上一篇:状态机(state machine) // 下一篇:必经之地(using) 基于语言提供的基本控制结构,更好地组织和表达程序,需要良好的控制结构. 前情回顾 上一次,我们说到状态机结构( ...
- request.getParameter()获取URL中文参数乱码的解决办法
这个问题耽误好长时间,URL传中文参数出现乱码,就算首次使用request接收就添加 request.setCharacterEncoding("UTf-8"); 依然报错不误. ...
- 06jQuery-04-DOM操作
jQuery既然是为了帮助你能从js的繁琐中解脱出来,自然在DOM操作上也有自己的一套. 1.修改Text和HTML 之前我们提到过,如果用JS的话,你要修改Text或者HTML需要用到其innerH ...
- Finding LCM (最小公倍数)
Finding LCM Time Limit: 2000MS Memory Limit: 32768KB 64bit IO Format: %lld & %llu [Submit] ...