hzk16理解和简单使用

一般我们使用16x16的点阵宋体字库,所谓16x16,是每一个汉字在纵、横各16点的区域内显示的。不过后来又有了HZK12、HZK24,HZK32和HZK48字库及黑体、楷体和隶书字库。虽然汉字库种类繁多,但都是按照区位的顺序排列的。前一个字节为该汉字的区号,后一个字节为该字的位号。每一个区记录94个汉字,位号则为该字在该区中的位置。

区号,位号

因此,汉字在汉字库中的具体位置计算公式为:94*(区号-1)+位号-1。减1是因为数组是以0为开始而区号位号是以1为开始的。这仅为以汉字为单位该汉字在汉字库中的位置,那么,如何得到以字节为单位得到该汉字在汉字库中的位置呢?只需乘上一个汉字字模占用的字节数即可,即:(94*(区号-1)+位号-1)一个汉字字模占用字节数,而按每种汉字库的汉字大小不同又会得到不同的结果。以1616点阵字库为例,计算公式则为:(94*(区号-1)+(位号-1))*32。汉字库文该从该位置起的32字节信息即记录了该字的字模信息。

示例代码:

// An highlighted block
#include <stdio.h>
#include <stdlib.h>

void Disp_HZK16(vooid)
{
	FILE *fp;
	char qh,wh;
	unsigned long offset;
	int array[16][16];
	char mat[16][2];
	char inclode[2] = {"涛"}; // 要读出的字符
	int i,j,k;
	char a = 0;

	qh = inclode[0] - 0xa0; //区号
	wh = inclode[1] - 0xa0; //位号
	offset = (94*(qh - 1) +(wh - 1))*32;
	printf("输出的16位汉字,区号,位号\n");
	putchar(inclode[0]);
	putchar(inclode[1]);
	putchar(',');
	printf("%d,%d\n",qh,wh);

	if((fp = fopen("HZK16","rb")) == NULL)
	{
		printf("\ncan not open file strike any key exit");
		getch();
		exit(1);
	}
	fseek(fp,offset,SEEK_SET);
	fread(mat,32,1,fp);
	fclose(fp);


	for(i=0; i<16; i++)
	{
		for(j=0; j<2; j++)
		{
			for(k=0; k<8; k++)
			{
				if(mat[i][j] & (0x80>>k))array[i][a+k] = '+';
				else array[i][a+k] = ' ';
			}
			a += 8;

		}
		a = 0;
	}

	for(i=0; i<16; i++)
	{
		for(j=0; j<16; j++)
		{
			printf("%c",array[i][j]);
		}
		printf("\n");
	}
	printf("\n");
}

int main(int argc, char *argv[])
{
	Disp_HZK16();
	return 0;
}

运行截图:
在这里插入图片描述
参考地址:https://download.csdn.net/download/fengyecl/7073701

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值