起因:

早在阅读tslib源代码时就注意到里面有font_8x8.c和font_8x16.c两个文件(后来才得知,它们来自Linux内核,具体目录是./drivers/video/console),它们包含了在屏幕上显示所需的所有字符(当然,是可打印字符),由此也看了一下tslib显示字符的代码。对将来在触摸屏上显示汉字有所帮助,——这是后话,暂且按下不提。

上面所说的字符当然是ASCII码了,这种编码学过计算机的人可能会很熟悉,就不多讲了。本文所述者,就是通过ASCII码字库文件(网上有下载)和上面提到的其中之一的文件在终端上显示ASCII字符。这也为研究汉字显示打下基础(此为假话,写文章及做作所需也,实际上本文作者是先研究汉字显示再研究ASCII码显示的,勿模仿,切切)。

本文中使用的字库是8x16,每个字符占用内存空间为16字节(后面不再提及),文中显示字符所做工作有下面几步(显示汉字也差不多,当然,这又是后话 ):

1、打开字库文件(似乎是废话);

2、计算出要打印的字符在字库文件中的偏移量(亦即网上所说的“寻址”);

3、将这个偏移地址的数据(16字节)读取缓冲区中;

4、显示这个缓冲区,为1者打印,为0者留空。(由于是在终端上显示,因此,可以使用如“#”、“*”等字符代替。)

先说说如何找到某个字符在字库文件中的偏移量。字库里的字符排序是符合ASCII码顺序的,而每个字符占16字节,因此,将要打印的字符与16相乘,便得到这个字符在字库中的位置了,这个位置之后的16个字节的数据,就是这个字符了。比如大写字母“A”,十六进制是0x41(“A”还是十进制的65、八进制的101,其实都是一回事),它与0x10(十进制的16)相乘,得到0x410(计算机中使用十六进制十分方便,对于某些试题要求计算出某地址的十进制,我表示不理解,既不直观,又不方便,还容易出错)。使用十六进制编辑器(用UE相信会更方便些)查看这个偏移量,会发现有如下数据:

$ hexdump -C ../HZK/ASC16 | grep 410

00000410  00 00 10 38 6c c6 c6 fe  c6 c6 c6 c6 00 00 00 00  |...8l...........|

所谓的字库,里面就是一些二进制数据。我们看看上面得到“A”的16个字节数据显示效果是怎样的。将上面的十六进制数据按二进制输出,一个字节一行,共占16行,如下:

00000000

00000000

00010000

00111000

01101100

11000110

11000110

11111110

11000110

11000110

11000110

11000110

00000000

00000000

00000000

00000000

不直观,将出现0的地方留空,则变成如下形状(受网页影响,为美观起见进行调整,虽非实际中二进制所示,但形状是一致的):

1

111

11  11

11      11

11      11

1111111

11      11

11      11

11      11

11      11

上面的便是传说中的“A”了。

下面就用代码读取字库信息,并显示出来。完整代码如下:

/***************************************************

源代码文件编码:ANSI

测试环境编码:zh_CN.UTF-8、zh_CN.gd2312

* ************************************************/

#include

#include

#include

#include

#include

#include

#include

#include

#ifdef DEBUG

#define debug(fmt, ...) printf(fmt, #__VA_ARGS__)

#else

#define debug(fmt, ...)

#endif

void display_font_ascii(

char *asc)

{

int i, j;

debug(

"=================/n");

for(i=

0;i<

16;i++)

{

for(j=

0;j<

8;j++)

{

/* 逐位相与,为1者打印“*”,否则打印空格 */

if(asc[i] & (

0x80>>j))

printf(

"*");

else

printf(

" ");

}

printf(

"/n");

}

debug(

"=================/n");

}

int main()

{

int i;

unsigned

char *p;

unsigned

char asciicode[] =

"Ab";

unsigned

long offset;

FILE *asc;

char ascii[

16];

if((asc=fopen(

"ASC16",

"rb"))==NULL)

{

perror(

"Can't Open ASC16");

exit(

0);

}

/* ASCII字库文件 */

for (i =

0; i <

sizeof(asciicode)-

1; i++)

{

debug(

"%c %x/n", asciicode[i], asciicode[i]);

/* 打印数值 */

offset = asciicode[i]*

16;

debug(

"offset: %x/n", offset);

/* 打印偏移量 */

fseek(asc,offset,SEEK_SET);

fread(ascii,

16,

1,asc);

/* 读取16字节 */

display_font_ascii(ascii);

/* 显示 */

}

fclose(asc);

return

0;

}

由于是示意性代码,不必纠结于代码优化、代码风格等等问题。效果(同样进行了调整)如下:

$ ./a.out

*

***

**  **

**      **

**      **

*******

**      **

**      **

**      **

**      **

***

**

**

****

**  **

**    **

**    **

**    **

**    **

*****

还有另一种方法,不读取字库,而是将所有的字符存放于某个数组中,比如像font_8x16.c文件中的fontdata_8x16数组。这里假设数组为ascii_code,那么,上面的代码只需修改一小部分,如下:

for (i = 0; i < sizeof(asciicode)-1; i++)

{

debug("%c %x/n", asciicode[i], asciicode[i]);

offset = asciicode[i]* 16; // 寻址

p = ascii_code+offset;    // 查找字符在ascii_code数组中的偏移量

debug("offset: %x/n", offset);

display_font_ascii(p);

}

效果是一样的,所不同的是,前一种方法需要读取字库文件,后一种方法直接在内存中读取,完整的ASCII码占用空间为4KB。不过,ASCII中可打印的字符共96个(经过认真数那些可打印的字符,发现实际上是95个(即32号到126号),这里将127号算上了,具体的请搜索一下ASCII),占用空间为96*16,即1536字节。由于前面0x20(即32)个字符在显示中没有用到,因此是可以去掉的,这样一来,寻址方式又稍有不同,如下:

for (i = 0; i < sizeof(asciicode)-1; i++)

{

debug("%c %x/n", asciicode[i], asciicode[i]);

offset = (asciicode[i] - 0x20 )* 16; // 寻址

p = ascii_code+offset;    // 查找字符在ascii_code数组中的偏移量

debug("offset: %x/n", offset);

display_font_ascii(p);

}

由于文中涉及知识、代码、字库文件都可以在网络上找到,因此文中就不提供下载了。

资料:

1、ASCII码字库,有多种形式,如8*16、8*12,名称为ASC12、ASC16,搜索一下就能找到。

2、“字库数组”,可以在Linux内核源代码的./drivers/video/console目录下找到很多相关代码文件,如font_8x8.c、font_8x16.c、font_sun8x16.c等等。像font_8x16.c文件,代码中说是由cpi2fnt这个东西产生的,但搜索一下,没什么介绍,英文的又不想去看,对这个东西也就不了解了。

3、可以搜索一下字库生成工具,用这些工具可以生成需要的字库。

linux点阵ascii像素字体,点阵字体显示系列之一:ASCII码字库的显示相关推荐

  1. linux点阵ascii像素字体,点阵字体显示系列之一:ASCII码字库的显示 | 迟思堂工作室...

    起因: 早在阅读tslib源代码时就注意到里面有font_8x8.c和font_8x16.c两个文件(后来才得知,它们来自Linux内核,具体目录是./drivers/video/console),它 ...

  2. linux点阵字符显示字体颜色,点阵字体显示系列之一:ASCII码字库的显示

    起因: 早在阅读tslib源代码时就注意到里面有font_8x8.c和font_8x16.c两个文件(后来才得知,它们来自Linux内核,具体目录是./drivers/video/console),它 ...

  3. 点阵字体显示系列之一:ASCII码字库的显示

    起因: 早在阅读tslib源代码时就注意到里面有font_8x8.c和font_8x16.c两个文件(后来才得知,它们来自Linux内核,具体目录是./drivers/video/console),它 ...

  4. 点阵字库显示系列之二:GB2312点阵字库显示

    免责声明:         本文是作者在研究过程中的一篇文章,本着互联网共享.自由(free,应该不是"免费")之精神发布于此.作者才疏学浅,孤陋寡闻,能力有限,对文中出现的术语及 ...

  5. 点阵字体显示系列之二:汉字显示

    http://blog.csdn.net/subfate/article/details/6444582 免责声明: 本文是作者在研究过程中的一篇文章,本着互联网共享.自由(free,应该不是&quo ...

  6. 点阵字体显示系列补记2:关于24点阵汉字显示程序及其修改版本

    自从写完16点阵后,由于没啥事做,就继续看看24点阵是如何显示的.这种规格的点阵是使用UCDOS(虽然下载了,但用不了)中的汉字字库.又千辛万苦找到ASCII码的24点阵,再修改前面的程序,生成24点 ...

  7. 点阵字体显示系列之三:使用ncurses显示汉字

    ncurses这个库,最早听说应该是当年刚接触Linux的时候,当时,我们宿舍就一个人在鼓捣Linux,他是我们后来的班长,如今在ZLG混,也不知混得怎么样了.我也不知道哪条神经线路出现故障了,竟然傻 ...

  8. 点阵字体, 矢量字体

    点阵字体 http://zh.wikipedia.org/wiki/%E7%82%B9%E9%98%B5%E5%AD%97%E4%BD%93 点阵字体也叫位图字体,其中每个字形都以一组二维像素信息表示 ...

  9. python获取中文字体点阵坐标_Python实现点阵字体读取与转换的方法

    点阵字体是指根据文字的像素点来显示的字体,效果如下: 使用Python读取并显示的过程如下: 根据中文字符获取GB2312编码 通过GB2312编码计算该汉字在点阵字库中的区位和码位 通过区位和码位计 ...

最新文章

  1. Ajax请求中的async:false/true的作用
  2. 最新款服务器主板,服务器主板
  3. java8 stringbuilder_为什么 Java 8 中不再需要 StringBuilder 拼接字符串
  4. 将Vue+Nodejs项目部署到阿里云服务器
  5. Asp.net 文件上传的 FileUpload FileName 和 FileUpload PostedFile.FileName的细节问题
  6. 大型网站架构设计系列总结
  7. 非双一流普通院校毕业,你凭什么斩获 BAT 的 Offer?
  8. [图:知识竞赛题库PPT制作] 为上海棒约翰餐饮管理有限公司定制的的知识竞赛题目及展示界面-PPT格式-双屏展示。
  9. linux中程序定时重启脚本,linux 程序定时重启脚本
  10. FANUC系统开发API(FOCAS2)pc应用开发,机加工领域
  11. opencore添加Linux引导,黑苹果OpenCore引导详细教程
  12. 随机抽样、分层抽样、整群抽样、系统抽样的区别
  13. CC2652RB1F开发板烧录ZNP的固件
  14. QRCode简单生成二维码
  15. [LOJ#10064]黑暗城堡
  16. 大数据和云计算技术周报(第7期)
  17. 备战数学建模9-层次分析法模型
  18. Java入门篇(一)——如何编写一个简单的Java程序
  19. java如何设置例外站点_java添加例外站点
  20. 网易云音乐.uc格式的缓存文件转.mp3

热门文章

  1. NVIDIA显卡设置不可用——您当前未使用连接到NVIDIA GPU的显示器
  2. 318、关于无线网桥最常见的10个问题解答
  3. 怎样打开QQ里的图纸查看?
  4. 力扣刷题之路 38. 外观数列 Python解
  5. SpringCloud(7)—— 国寿i动项目经验之(过滤器Filter技术(请求体二次解密处理技术))...
  6. 石头扫地机器人遇见地毯_可吸地毯!新石头扫地机器人使用总结
  7. html设置字号行高,【HTML】自定义富文本设置行高
  8. nodejs生成图片验证码
  9. ESP8266用virtualBox虚拟机编译ESP8266_NONOS_SDK教程
  10. 解决window.showModalDialog在Firefox无法支持