⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hzk12.cpp

📁 1212汉字库.rar
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				fprintf(fp2,";");
				fseek(fp1,-ll0,1);
				for(int k=0;k<t;k++)
					fputc(fgetc(fp1),fp2);		//把最后一行汉字注释出来
				break;
			}
		}while(1);

		fprintf(fp2,"%c%c",0x0d,0x0a);
		if(!(i%16))
		{
			fprintf(fp2,"//共%d行,每行8个汉字 ",j);
			fprintf(fp2,"总计(%d*%d)=%d个汉字 测试累加值为 %d",j,8,(j*8),i/2);
		}
		else
		{		
			fprintf(fp2,"//共%d行,最后一行除外每行8个汉字,最后一行%d个汉字 ",j,(i%16)/2);
			fprintf(fp2,"总计(%d*%d)+%d=%d个汉字 测试累加值为 %d",j-1,8,(i%16)/2,((j-1)*8)+(i%16)/2,i/2);
		}
		fprintf(fp2,"%c%c",0x0d,0x0a);
	}
	fprintf(fp2,"%c%c",0x0d,0x0a);
	//-------------------------------------------------------
	//写入汉字内码表对应的点阵表
	m=0;//最大限制值
	fseek(fp1,0,0);							//文件指针指向开头第1字节
	un.st.b=fgetc(fp1);						//取汉字的第一个字节
	un.st.a=fgetc(fp1);						//取汉字的第二个字节
	if(ch=='c'||ch=='C')						//C51格式的点阵数据
	{
		fprintf(fp2,"//汉字内码表对应点阵,每行1个汉字24字节:");			
		fprintf(fp2,"%c%c",0x0d,0x0a);
		fprintf(fp2,"uchar code hzdz [ ][%d] = {",HZDZ_LEN);
		fprintf(fp2,"%c%c",0x0d,0x0a);
		while(1)
		{
			if(feof(fp1))
			{
				cout<<"\nThe FILE1.TXT have finished!\n";
				break;					//点阵提取结束
			}			
			un0.ll=gethzdz(un.ab);				//取该汉字的24字节点阵数据
			m++;
			if(un0.ll==0xb020)				//读HZK12文件到结尾,返回一个数作为标志
				break;					//'啊'的内码-0xA1A1=0xB040
			//------------------------------------------------
			//hanzi_view();					//查看24字节汉字点阵的外形是不是刚才读取的汉字
			//------------------------------------------------
			//将这个汉字的点阵数据写入目标文件
			fgetc(fp1);					//注意fp加1了,后面需要fseek(fp1,-1L,1);
			for(int i=0;i<(HZDZ_LEN-1);i++)
			{
				fprintf(fp2,"0x%.2x%c",hzdz[i],',');
				//if(i==12)
				//	fprintf(fp2,"%c%c",0x0d,0x0a);
			}
			if(feof(fp1))					//这个判断必需上一句fgetc(fp1);
			{
				fprintf(fp2,"0x%.2x}",hzdz[i]);		//结束时数据尾不需要有逗号了
			}
			else
				fprintf(fp2,"0x%.2x%c",hzdz[i],',');
			fprintf(fp2,"%c%c",0x0d,0x0a);
			///-------------------------------------------
			//view 观察
			printf("\ntotal  m = %d\n",m);
			/*
			printf("\nposition = %x",un0.st0.d);
			printf("%x",un0.st0.c);
			printf("%x",un0.st0.b);
			printf("%0.2xH BYTE\n	 = 32*((FIRST-0xA1)*94+(SECOND-0xA1))\n",un0.st0.a);
			cout<<"\ncontinue(y/n)?\n";
			*/
			//ch=getch();
			//if(ch=='n'||ch=='N')
			//	break;
			//--------------------------------------------------------------------------
			if(m>=7000)		 			//限制最多提取7000个汉字,比国标还多,够了吧?国标只有6000多个
			{
				fprintf(fp2,"不会吧,你的汉字库比国标还大?\n");
				break;		 			//如果汉字库没有错,根本不会从这里退出
			}
			fseek(fp1,-1L,1);				//这里要减去1,因为前面有fgetc(fp1);
			un.st.b=fgetc(fp1);	 			//取汉字内码第1字节
			un.st.a=fgetc(fp1);	 			//取汉字内码第2字节
		}
	}
	else								//汇编格式的点阵数据
	{
		fprintf(fp2,";汉字内码表对应点阵,每行1个汉字(24字节)"); 
		fprintf(fp2,"%c%c",0x0d,0x0a);
		fprintf(fp2,"hzdz_addr:");
		fprintf(fp2,"%c%c",0x0d,0x0a);
		while(1)
		{
			if(feof(fp1))					//检测FILE1.TXT文件是否结束
			{
				cout<<"\nThe FILE1.TXT have finished!\n";
				break;					//点阵提取结束
			}
			un0.ll=gethzdz(un.ab);				//取该汉字的24字节点阵数据
			m++;
			if(un0.ll==0xb020)				//读HZK12文件到结尾,返回一个数作为标志
				break;					//'啊'的内码-0xA1A1=0xB040
			//------------------------------------------------
			//hanzi_view();					//查看24字节汉字点阵的外形对照读取的汉字
			//------------------------------------------------
			//将这个汉字的点阵数据写入文件
			for(int i=0;i<HZDZ_LEN;)
			{
				if(!i)
					fputs("DB ",fp2);
				fprintf(fp2,"0%.2xH%c",hzdz[i],',');
				i++;

				fprintf(fp2,"0%.2xH",hzdz[i]);
				i++;
				if(i<(HZDZ_LEN-1))
					fputc(',',fp2);
			}
			fprintf(fp2,"%c%c",0x0d,0x0a);//回车
			///-------------------------------------------
			//view 观察
			printf("\ntotal  m = %d \n",m);
			/*
			printf("\nposition = %x",un0.st0.d);
			printf("%x",un0.st0.c);
			printf("%x",un0.st0.b);
			printf("%xH BYTE\n	 = 32*((FIRST-0xA1)*94+(SECOND-0xA1))\n",un0.st0.a);
			cout<<"\ncontinue(y/n)?\n";
			*/
			//ch=getch();
			//if(ch=='n'||ch=='N')
			//	break;
			//--------------------------------------------------------------------------
			if(m>=7000)					//限制最多提取7000个汉字,比国标还多,够了吧?国标只有6000多个
			{
				fprintf(fp2,"不会吧,你的汉字库比国标还大?\n");
				break;		 			//如果汉字库没有错,根本不会从这里退出
			}
			un.st.b=fgetc(fp1);	 			//取汉字内码第1字节
			un.st.a=fgetc(fp1);	 			//取汉字内码第2字节
		}
	}
	fclose(fp1);
	fclose(fp2);
	cout<<"\nPress any key to exit "<<endl;
	getch();
	return;
}

/*
函数功能:计算获取汉字内码对应的24字节的点阵数据
计算公式:该汉字在点阵字库HZK12里存放的位置=([汉字的第1字节-0xA1]*94+[汉字的第2字节-0xA1])*24 字节
同样,     该汉字在点阵字库HZK16里存放的位置=([汉字的第1字节-0xA1]*94+[汉字的第2字节-0xA1])*32 字节
明白了吧? 16*16点阵每个汉字需要(16*16)/8=32字节空间,12*12点阵每个汉字需要(12*16)/8=24字节的空间,每
行有4个点是没有用的,即每行第2个字节有4位无点阵数据,实际上每个汉字可以压缩成(12*12)/8=18字节.
*/
unsigned long gethzdz(unsigned int n)
{
	FILE *fp;
	static unsigned long m=0xb020;
	unsigned long j,k;            	//如何定义可以实现最小的内存占用?
	char i;
	union word
	{
		unsigned int ab;
		struct bytes
		{
			unsigned char a;
			unsigned char b;
		}st;
	}un;
	//***********************************
	//start
	if((fp=fopen("HZK12","rb"))==NULL)
	{
		cout<<"Read HZK12 error !\n";
		cout<<"Press any key to exit!";
		getch();
		return m ;
	}
	//************************************************
	un.ab=n;
	un.ab-=0xa1a1;
	j=un.st.b;
	k=un.st.a;
	//************************************************
	//view
	window(1,2,16,18);//左、上、右、下
	/*
	printf("\nthe new value un.ab-0xA1A1 = %04.4x ",un.ab);
	//getch();
	printf("\nunsigned char un.st.b = %02.2x ",un.st.b);
	printf(" to  unsigned long j = %02.2lx  ",j);
	printf("\nunsigned char un.st.a = %02.2x ",un.st.a);
	printf(" to  unsigned long k = %02.2lx \n",k);
	*/
	//getch();
	//************************************************
	m=HZDZ_LEN*(j*94+k);
	//**************************************************
	//view
	/*
	printf("we get the position = 32*(%0.2x*94+%0.2X)\n",j,k);
	printf("                    = %0.2lx\n",m);
	*/
	//getch();
	//**************************************************
	if(fseek(fp,m,0))
	{
		fclose (fp);
		return 0xb020;		//读HZK12文件到结尾
	}
	for(i=0;i<HZDZ_LEN;i++)
			hzdz[i]=fgetc(fp);
	fclose(fp);
	return (m);
}

//汉字点阵数据显示观察
/*
void hanzi_view()
{
	int k;
	for(char i=0;i<HZDZ_LEN;)
	{
		for(char j=0;j<8;j++)
		{
			k=7-j;
			line[j]=(hzdz[i])>>k;
			line[j]&=0x01;
		}
		i++;
		for(;j<16;j++)
		{
			k=15-j;
			line[j]=(hzdz[i])>>k;
			line[j]&=0x01;
		}
		i++;
		for(j=0;j<(HZDZ_LEN/2);j++)
		{
			if(line[j])
				printf(" o",line[j]);
			else
				printf("  ");
		}
		cout<<endl;
	}
}
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -