证明:
GB2312编码对所收录字符进行了分区处理,共94区,每区含有94位,这种表示方式称为区位码。
如“啊"位于16区的01位,所以它的区位码就是1601(区位码用十进制表示)。
由区位码得到一个汉字在GB2312中的序号:order=94*(区号-1)+(位号-1)(减1是因为区位号从1开始)。
因为计算机中存储的是机内码,机内码高低字节分别减去0XA0可得到区位码:区号=AB-0XA0;位号=CD-0XA0;
故由机内码得到一个汉字在GB2312中的序号:order=94*(AB-0XA1)+(CD-0XA1)
对于16x16点阵字库,每个汉字占32字节,故该汉字在字库文件中的距离文件头的偏移字节数为:
offset=[(AB-0XA1)*94+(CD-0XA1)]*32
程序:
#include<stdio.h>
int main()
{
FILE*fp=fopen("HZK16","rb");
unsigned char buf[2];
while(scanf("%s",buf)!=EOF)
{
unsigned int order=94*(buf[0]-0XA1)+(buf[1]-0XA1);
unsigned int position=order*32;
fseek(fp, position,0);
unsigned char tmp[32];
fread(tmp,sizeof(unsigned char),32,fp);
for(int i=0;i<32;i++)
{
//依次显示一个字节中的8位,若为1则显示'*',若为0则显示空格
for(int k=0;k<8;k++)
{
if((tmp[i]>>(7-k))&0X01)
printf("*");
else
printf(" ");
}
if(i%2==1)//每两字节(16位)一换行
printf("\n");
}
fseek(fp,0L,0);
}
fclose(fp);
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。