详细代码:https://github.com/cxcn/dtool

前言

.def 是百度手机输入法-更多设置-自定义输入方案所使用的格式。

解析

码表偏移量 0x6D

# 占用字节数 描述
a 1 编码长度(红色框)
b 1 词长 * 2 + 2
a 编码(黄色框),可以是纯编码,也可以是 编码=位置
b-2 词(绿色框),utf16-le 编码
6 6 个空字节代表词条结束

代码实现:

  1. r.Seek(0x6D, 0) // 从 0x6D 开始读
  2. for r.Len() > 4 {
  3. codeLen, _ := r.ReadByte() // 编码长度
  4. wordSize, _ := r.ReadByte() // 词长*2 + 2
  5. // 读编码
  6. tmp = make([]byte, int(codeLen))
  7. r.Read(tmp) // 编码切片
  8. code := string(tmp)
  9. spl := strings.Split(code, "=") // 直接删掉 = 号后的
  10. code = spl[0]
  11. // 读词
  12. tmp = make([]byte, int(wordSize)-2) // -2 后就是字节长度,没有考虑4字节的情况
  13. r.Read(tmp)
  14. word, _ := util.Decode(tmp, "UTF-16LE")
  15. // def = append(def, defEntry{word, code, order})
  16. ret = append(ret, Entry{word, code, 1})
  17. r.Seek(6, 1) // 6个00,1是相对当前位置
  18. }

生成

码表部分和解析一样的,没什么好说的。

主要考虑前 0x6C(109) 个字节。

第一个字节意义不明,可能是最大码长(一般是 0,有的码表里是 4)

后面每 4 字节一组,共 27 组。

表示以 26 个首字母开头词条的字节长度累加(不包括前 2 个表示长度的字节,包括后 6 个 0)

计算时,统计每个首字母的长度累计,写入时再次累加。

代码实现:

  1. func (BaiduDef) Gen(table Table) []byte {
  2. jdt := ToJdTable(table)
  3. var buf bytes.Buffer
  4. // 首字母词条字节数统计
  5. lengthMap := make(map[byte]int)
  6. buf.Write(make([]byte, 0x6D))
  7. for _, v := range jdt {
  8. code := v.Code
  9. for i, word := range v.Words {
  10. if i != 0 { // 不在首选的写入位置信息,好像没什么用?
  11. code = v.Code + "=" + strconv.Itoa(i+1)
  12. }
  13. sliWord, _ := util.Encode([]byte(word), "UTF-16LE") // 转为utf-16le
  14. buf.WriteByte(byte(len(code))) // 写编码长度
  15. buf.WriteByte(byte(len(sliWord) + 2)) // 写词字节长+2
  16. buf.WriteString(code) // 写编码
  17. buf.Write(sliWord) // 写词
  18. buf.Write([]byte{0, 0, 0, 0, 0, 0}) // 写6个0
  19. // 编码长度 + 词字节长 + 6,不包括长度本身占的2个字节
  20. lengthMap[code[0]] += len(code) + len(sliWord) + 2 + 6
  21. }
  22. }
  23. // 文件头
  24. byteList := make([]byte, 0, 0x6D)
  25. byteList = append(byteList, 0) // 第一个字节可能是最大码长?
  26. // 长度累加
  27. var currNum int
  28. for i := 0; i <= 26; i++ {
  29. currNum += lengthMap[byte(i+0x60)]
  30. currBytes := make([]byte, 4)
  31. binary.LittleEndian.PutUint32(currBytes, uint32(currNum))
  32. byteList = append(byteList, currBytes...)
  33. }
  34. // 替换文件头
  35. ret := buf.Bytes()
  36. copy(ret, byteList)
  37. return ret
  38. }

参考资料:

DictTool 词库处理工具

输入法词库解析(一)百度自定义方案.def的更多相关文章

  1. 输入法词库解析(四)百度分类词库.bdict(.bcd)

    前言 .bdict 是百度的分类词库格式,可以在 https://shurufa.baidu.com/dict 下载. 手机百度的分类词库格式 .bcd 是一样的,可以在 https://mime.b ...

  2. 输入法词库解析(六)QQ 拼音分类词库.qpyd

    详细代码:https://github.com/cxcn/dtool 前言 .qpyd 是 QQ 拼音输入法 6.0 以下版本所用的词库格式,可以在 http://cdict.qq.pinyin.cn ...

  3. 输入法词库解析(三)紫光拼音词库.uwl

    详细代码:https://github.com/cxcn/dtool 前言 .uwl 是紫光拼音输入法(现在叫华宇拼音输入法)使用的词库. 解析 紫光的词库有点复杂,拼音用的索引,但是拼音表没有写在词 ...

  4. 输入法词库解析(二)搜狗拼音细胞词库.scel(.qcel)

    详细代码:https://github.com/cxcn/dtool 前言 .scel 是搜狗拼音输入法所使用的细胞词库格式,可以在 https://pinyin.sogou.com/dict/ 下载 ...

  5. 输入法词库解析(七)微软用户自定义短语.dat

    详细代码:https://github.com/cxcn/dtool 前言 微软拼音和微软五笔通用的用户自定义短语 dat 格式. 解析 前 8 个字节标识文件格式 machxudp,微软五笔的 le ...

  6. 输入法词库解析(五)极点码表.mb

    详细代码:https://github.com/cxcn/dtool 前言 mb 是极点五笔的码表格式. 解析 偏移量 描述 0x00 版本信息 0x1B 码表介绍 0x11F 所用到的按键数 0x1 ...

  7. paip 自定义输入法多多输入法词库的备份导出以及导入

    paip 自定义输入法词库的备份导出以及导入 作者Attilax 艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.net/ ...

  8. 用C语言将搜狗输入法词库转换成QQ拼音输入法词库

    搜狗输入法词库格式: 'ni'kan'xia 你看下 'ni'kan'xia'gai'hou 你看下改后 'ni'kan'xing'ma 你看行吗 'ni'kan'zen'me'yang 你看怎么样 ...

  9. 把搜狗输入法词库导入Google拼音输入法

    为PC端Google拼音输入法增加词库 为什么折腾词库 都在说百度.讯飞等输入法上传用户词库,为了安全建议大家使用google输入法之类,话说回来,要想使用智能联想功能是不是就得把你输入习惯放在他的里 ...

随机推荐

  1. Linux操作系统(4):磁盘分区、挂载

    Outline: ① lsblk :查看所有设备挂载情况 ② df -h :查询系统整体磁盘使用情况 ③ du -h /目录 :查询指定目录的磁盘占用情况 ④ mount :查询系统中已经挂载的设备 ...

  2. 攻防世界MISC进阶区 61-63

    61.肥宅快乐题 得到swf文件,但是用PotPlayer打不开,用浏览器应该可以打开,打开后可以在npc的对话中看到一段base64 解密后就可以得到flag 62.warmup 得到一张png和一 ...

  3. 常用源&配置

    ubuntu16.04 阿里 cp /etc/apt/sources.list /etc/apt/sources.list.orgin && \ echo "\ deb ht ...

  4. 是时候优雅的和NullPointException说再见了

    是时候优雅的和NullPointException说再见了 ️️️️️️️️️️️️️️️️ 最近在参加原创投稿比赛,本篇文章如果对你有帮助的话,欢迎帮忙点击助力下吧 NullPointExcepti ...

  5. DHCP原理及配置

    DHCP工作原理 集中的管理.分配IP地址,使client动态的获得IP地址.Gateway地址.DNS服务器地址等信息,并能够提升地址的使用率. 简单来说,DHCP就是一个不需要账号密码登录的.自动 ...

  6. Kafka入门实战教程(7):Kafka Streams

    1 关于流处理 流处理平台(Streaming Systems)是处理无限数据集(Unbounded Dataset)的数据处理引擎,而流处理是与批处理(Batch Processing)相对应的.所 ...

  7. CF1007A Reorder the Array 题解

    To CF 这道题是排序贪心,将原序列排序后统计答案即可. 但是直接统计会超时,因为排序后具有单调性,所以可以进行一点优化,这样,便可以通过此题. 而这道题的优化在于单调性,因为 \(a[i+1]\) ...

  8. WSL2安装Ubuntu20.04

    前言:听说WSL2需要Window版本在1904以上(我的window版本是1909,所以未能验证真实性) 启用WSL 控制面板 → 程序 → 程序和功能 → 启用或关闭Windows功能 勾选 适用 ...

  9. go-zero单体服务使用泛型简化注册Handler路由

    一.Golang环境安装及配置Go Module https://go-zero.dev/cn/docs/prepare/golang-install mac OS安装Go# 下载并安装Go for ...

  10. 面试突击69:TCP 可靠吗?为什么?

    相比于 UDP 来说,TCP 的主要特性是三个:有连接.可靠.面向数据流.所谓的"有连接"指的是 TCP 中的连接管理机制,也就是著名的三次握手和四次挥手,就像打电话一样,想要正常 ...