你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于gb2312字库的问题

[复制链接]
ssssss 提问时间:2018-8-30 13:46 /
阅读主题, 点击返回1楼
收藏 评论24 发布时间:2018-8-30 13:46
24个回答
STM1024 回答时间:2018-8-30 15:30:21
wwwheihei 发表于 2018-8-30 15:06
明白了 我得用我的子模库替换里面的子模库是吧?

是的,当时写程序写的简单粗暴了点,直接hard code了,你把你的文件重命名成和我这个一样的。(推荐先做个备份)
ssssss 回答时间:2018-8-30 15:33:17
stm1024 发表于 2018-8-30 15:30
是的,当时写程序写的简单粗暴了点,直接hard code了,你把你的文件重命名成和我这个一样的。(推荐先做 ...

明白了谢谢指导
ssssss 回答时间:2018-8-30 17:51:40
stm1024 发表于 2018-8-30 15:30
是的,当时写程序写的简单粗暴了点,直接hard code了,你把你的文件重命名成和我这个一样的。(推荐先做 ...

你这个软件的读bit方式是什么?是哪种扫描方式,我想验证一下,刚才我学了一下。汉字第一个字“啊”,计算得出它的偏移量为b040,那么我打开DZK文件,找到了地址后面的32byte个数据,现在想用手画出来,但不知道软件的扫描模式?
ssssss 回答时间:2018-8-31 09:51:41
本帖最后由 wwwheihei 于 2018-8-31 10:03 编辑
stm1024 发表于 2018-8-30 15:30
是的,当时写程序写的简单粗暴了点,直接hard code了,你把你的文件重命名成和我这个一样的。(推荐先做 ...

我现在想看看汉字第一个字“啊”的字模,刚算出来偏移地址在b040,能告诉我你的软件的扫描读取模式吗?我想手动画出“啊”字算法如下:
GB2312编码总共分了94个区,编码从0xA1 ~OxFE,每个区又有94个位,编码从0xA1 ~OxFE。比如我们常见的“啊”字,他的编码是B0A1,那么我们就可以根据这个编码来计算出他所在字库的地址。“啊”字的区码为BO,位码位A1,那么他所在的地址为((B0-A1) X 94+(A1- A1))X每个汉字的占用字节数。以12X 12为例,那么汉字“啊”所在的地址为((B0-A1)X94+(A1 - A1))X24= 33840(十六进制表示为0x8430),那么从地址0x8430开始的24个字节就是汉字“啊”的点阵数据。

      当选择移除预留选项时,则AA-AFP 区将移除,这时,当区码大于A9时需再减6,才能正确进行定位。


oo.png
STM1024 回答时间:2018-8-31 10:58:18
本帖最后由 stm1024 于 2018-8-31 11:05 编辑
wwwheihei 发表于 2018-8-31 09:51
我现在想看看汉字第一个字“啊”的字模,刚算出来偏移地址在b040,能告诉我你的软件的扫描读取模式吗?我 ...

用C#写的
字模定位
  1. FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read);
  2.             if (l > 0x7f)
  3.                 fs.Seek(((h - 0x81) * 190 + (l - 0x41)) * 32, 0);
  4.             else
  5.                 fs.Seek(((h - 0x81) * 190 + (l - 0x40)) * 32, 0);
  6.             fs.Read(buffer, 0, 32);
复制代码

然后绘图的时候,是从左到右,从上到下扫描填充格子的。但是代码实现上,我是先画的左半部分(0,2,4..等偶数编号字节),然后再画右半部分的(1,3,5...等奇数编号字节)
  1. DrawGrids();
  2.             int n = buffer.Length;//32
  3.             Graphics g=Graphics.FromImage(bmp);

  4.             for(int i=0;i<16;i++)
  5.             {
  6.                 byte lc = buffer[2*i];
  7.                 for(int j=0;j<8;j++)
  8.                 {
  9.                     if ((lc & 0x80) == 0x80)
  10.                         g.FillRectangle(new SolidBrush(Color.Red), new Rectangle(xMargin + j * xGridSize, xMargin + i * xGridSize, xGridSize, xGridSize));
  11.                     lc <<= 1;
  12.                 }

  13.                 byte rc = buffer[2 * i + 1];
  14.                 for (int j = 0; j < 8; j++)
  15.                 {
  16.                     if ((rc & 0x80) == 0x80)
  17.                         g.FillRectangle(new SolidBrush(Color.Red), new Rectangle(xMargin + (j+8) * xGridSize, xMargin + i * xGridSize, xGridSize, xGridSize));
  18.                     rc <<= 1;
  19.                 }
  20.             }
  21.             pb_mod.Image = bmp;
复制代码


ssssss 回答时间:2018-8-31 11:57:43
stm1024 发表于 2018-8-31 10:58
用C#写的
字模定位
然后绘图的时候,是从左到右,从上到下扫描填充格子的。但是代码实现上,我是先画的左 ...

原来您是作者,可以加几种模式然后分享软件出来吗
STM1024 回答时间:2018-8-31 12:00:38
本帖最后由 stm1024 于 2018-8-31 12:08 编辑
wwwheihei 发表于 2018-8-31 11:57
原来您是作者,可以加几种模式然后分享软件出来吗

额,做这种事情得看心情,也要有时间。
不过最近挺忙没时间,然后也没心情……

模式的问题……其实这个也不是没想过, 基本上有
行模式,又可分为从左到右,或者从右到左
列模式:又可分为从上到下,或者从下到上
然后行/列模式可以做阴文(0显示1不显示)或阳文(正常的1显示0不显示)
这些组合,就可以达到8种,和一些TFT彩屏的方式差不多了
ssssss 回答时间:2018-8-31 15:26:07
stm1024 发表于 2018-8-31 12:00
额,做这种事情得看心情,也要有时间。
不过最近挺忙没时间,然后也没心情……

期待。。。。。。
wolfgang 回答时间:2018-8-31 16:02:23
字库?看你能否找到UCDOS的字库,那里面很多。
国标库文件里面也能找到,很多寻址方法

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

ssssss 回答时间:2018-8-31 16:11:17
wolfgang2015 发表于 2018-8-31 16:02
字库?看你能否找到UCDOS的字库,那里面很多。
国标库文件里面也能找到,很多寻址方法 ...

我看的只是gb2312而已
12

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版