user-0 提问: 关于HZK16数字和字母的字模提取

回复:
user: user-1
content: 引用 7 楼 chenpeng3 的回复:有人会用C#写这段代码吗，求赐教请问你搞定了吗，同求啊

user: user-2
content: 有人会用C#写这段代码吗，求赐教

user: user-3
content: 最近刚好看这个相关的东东。  HZK16 应该是GB2312， 分别有94个区和94个位。  内码和区位码的转换： 内码高字节 = 区码+0xA0H 内码低字节 = 位码+0xA0H  转成区位码之后 计算 内存中的偏移： 偏移 = ((区码- 1) * 94 + 位码 - 1) * 32;  提取的方式嘛，简单可以指定一个中文字符串：  “1234567890” （当然这个要输入法 输入中文的数字字符，编译文件指定是ANSI编码） 一个循环，每次2个字符分别代表了内码的高低字节。 然后转区位码，然后计算偏移，然后就拿到了32字节的点阵数据啦。  当然要使用的话，一般转成8字节的数据。

user: user-4
content: 全角符号（Ａａ１＃），半角符号（Aa1#） 开始、运行、charmap、确定，在字符映射表中查看对应字符的GBK码。

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:ASC16  搜索下载UCDOS，里面有HZK16和ASC16这两个文件  仅供参考： #include <mem.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> #include <graphics.h> const unsigned char bit[8]={128,64,32,16,8,4,2,1}; //-------------------------------------------------------- void dis(xoff,code)     unsigned int xoff,code; {     unsigned char *buffer;     FILE *hzk;     unsigned long offset;     unsigned int q,w;     int x,y,width;      buffer=calloc(32,1);     if ((code&0xFF00)!=0) {         w=(code&0x00FF)-0xA1;         q=((code>>8)&0x00FF)-0xA1;         offset=q*0x5E+w;         offset*=32;         if ((hzk=fopen("HZK16","rb"))==NULL) {             closegraph();             printf("Can not open HZK16\r\n");             exit(1);         }         fseek(hzk,offset,SEEK_SET);         fread(buffer,1,32,hzk);         fclose(hzk);         width=2;     }     else {         if ((hzk=fopen("ASC16","rb"))==NULL) {             closegraph();             printf("Can not open ASC16\r\n");             exit(1);         }         offset=code*16;         fseek(hzk,offset,SEEK_SET);         fread(buffer,1,16,hzk);         fclose(hzk);         width=1;     }     for (y=0;y<16;y++) for (x=0;x<8*width;x++) {         if (buffer[y*width+x/8]&bit[x%8]) putpixel(xoff+x,y,15);     }     free(buffer); } //-------------------------------------------------------- void display(p)     unsigned char *p; {    int i;   unsigned int qw;    i=0;   while (1) {     if (p[i]==0x0D||p[i]==0x1A) break; 	if (p[i]>0xA0) { 		qw=((unsigned int)p[i]<<8)|((unsigned int)p[i+1]&0x00FF); 		dis(8*i,qw); 		i+=2; 	} 	else { 		qw=(unsigned int)p[i]&0x00FF; 		dis(8*i,qw); 		i++; 	}   }  } //-------------------------------------------------------- void main() { 	int gdriver = DETECT, gmode, errorcode; 	long fl; 	FILE *hz; 	unsigned char *p;  	initgraph(&gdriver, &gmode, "c:\\borlandc\\bgi"); 	errorcode = graphresult(); 	if (errorcode != grOk) { 	   printf("Graphics error: %s\n", grapherrormsg(errorcode)); 	   exit(1); 	} 	hz=fopen("hz","rb"); 	fseek(hz,0,SEEK_END); 	fl=ftell(hz); 	p=calloc((int)fl,sizeof(unsigned char)); 	rewind(hz); 	fread(p,1,(int)fl,hz); 	fclose(hz); 	display(p); 	free(p); 	getch(); 	closegraph(); }    谢谢赵四老师的回答，我会下载一个ASC16的字库试试，但是这里我还是有一个疑问，HZK16字库里面A1-A9 是符号区，我看字模数据表，里面也有字母和数字，不知道这些字符在HZK16里面要怎么读取出来呢

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:全角符号（Ａａ１＃），半角符号（Aa1#） 开始、运行、charmap、确定，在字符映射表中查看对应字符的GBK码。  用ASC16确实可以得到标点和英文的数据，谢谢。

user: user-4
content: ASC16  搜索下载UCDOS，里面有HZK16和ASC16这两个文件  仅供参考： #include <mem.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> #include <graphics.h> const unsigned char bit[8]={128,64,32,16,8,4,2,1}; //-------------------------------------------------------- void dis(xoff,code)     unsigned int xoff,code; {     unsigned char *buffer;     FILE *hzk;     unsigned long offset;     unsigned int q,w;     int x,y,width;      buffer=calloc(32,1);     if ((code&0xFF00)!=0) {         w=(code&0x00FF)-0xA1;         q=((code>>8)&0x00FF)-0xA1;         offset=q*0x5E+w;         offset*=32;         if ((hzk=fopen("HZK16","rb"))==NULL) {             closegraph();             printf("Can not open HZK16\r\n");             exit(1);         }         fseek(hzk,offset,SEEK_SET);         fread(buffer,1,32,hzk);         fclose(hzk);         width=2;     }     else {         if ((hzk=fopen("ASC16","rb"))==NULL) {             closegraph();             printf("Can not open ASC16\r\n");             exit(1);         }         offset=code*16;         fseek(hzk,offset,SEEK_SET);         fread(buffer,1,16,hzk);         fclose(hzk);         width=1;     }     for (y=0;y<16;y++) for (x=0;x<8*width;x++) {         if (buffer[y*width+x/8]&bit[x%8]) putpixel(xoff+x,y,15);     }     free(buffer); } //-------------------------------------------------------- void display(p)     unsigned char *p; {    int i;   unsigned int qw;    i=0;   while (1) {     if (p[i]==0x0D||p[i]==0x1A) break; 	if (p[i]>0xA0) { 		qw=((unsigned int)p[i]<<8)|((unsigned int)p[i+1]&0x00FF); 		dis(8*i,qw); 		i+=2; 	} 	else { 		qw=(unsigned int)p[i]&0x00FF; 		dis(8*i,qw); 		i++; 	}   }  } //-------------------------------------------------------- void main() { 	int gdriver = DETECT, gmode, errorcode; 	long fl; 	FILE *hz; 	unsigned char *p;  	initgraph(&gdriver, &gmode, "c:\\borlandc\\bgi"); 	errorcode = graphresult(); 	if (errorcode != grOk) { 	   printf("Graphics error: %s\n", grapherrormsg(errorcode)); 	   exit(1); 	} 	hz=fopen("hz","rb"); 	fseek(hz,0,SEEK_END); 	fl=ftell(hz); 	p=calloc((int)fl,sizeof(unsigned char)); 	rewind(hz); 	fread(p,1,(int)fl,hz); 	fclose(hz); 	display(p); 	free(p); 	getch(); 	closegraph(); }

user: user-0