输入法词库解析(一)百度自定义方案.def
前言
.def
是百度手机输入法-更多设置-自定义输入方案所使用的格式。
解析
码表偏移量 0x6D
# | 占用字节数 | 描述 |
---|---|---|
a | 1 | 编码长度(红色框) |
b | 1 | 词长 * 2 + 2 |
a | 编码(黄色框),可以是纯编码,也可以是 编码=位置 |
|
b-2 | 词(绿色框),utf16-le 编码 | |
6 | 6 个空字节代表词条结束 |
代码实现:
r.Seek(0x6D, 0) // 从 0x6D 开始读
for r.Len() > 4 {
codeLen, _ := r.ReadByte() // 编码长度
wordSize, _ := r.ReadByte() // 词长*2 + 2
// 读编码
tmp = make([]byte, int(codeLen))
r.Read(tmp) // 编码切片
code := string(tmp)
spl := strings.Split(code, "=") // 直接删掉 = 号后的
code = spl[0]
// 读词
tmp = make([]byte, int(wordSize)-2) // -2 后就是字节长度,没有考虑4字节的情况
r.Read(tmp)
word, _ := util.Decode(tmp, "UTF-16LE")
// def = append(def, defEntry{word, code, order})
ret = append(ret, Entry{word, code, 1})
r.Seek(6, 1) // 6个00,1是相对当前位置
}
生成
码表部分和解析一样的,没什么好说的。
主要考虑前 0x6C(109) 个字节。
第一个字节意义不明,可能是最大码长(一般是 0,有的码表里是 4)
后面每 4 字节一组,共 27 组。
表示以 26 个首字母开头词条的字节长度累加(不包括前 2 个表示长度的字节,包括后 6 个 0)
计算时,统计每个首字母的长度累计,写入时再次累加。
代码实现:
func (BaiduDef) Gen(table Table) []byte {
jdt := ToJdTable(table)
var buf bytes.Buffer
// 首字母词条字节数统计
lengthMap := make(map[byte]int)
buf.Write(make([]byte, 0x6D))
for _, v := range jdt {
code := v.Code
for i, word := range v.Words {
if i != 0 { // 不在首选的写入位置信息,好像没什么用?
code = v.Code + "=" + strconv.Itoa(i+1)
}
sliWord, _ := util.Encode([]byte(word), "UTF-16LE") // 转为utf-16le
buf.WriteByte(byte(len(code))) // 写编码长度
buf.WriteByte(byte(len(sliWord) + 2)) // 写词字节长+2
buf.WriteString(code) // 写编码
buf.Write(sliWord) // 写词
buf.Write([]byte{0, 0, 0, 0, 0, 0}) // 写6个0
// 编码长度 + 词字节长 + 6,不包括长度本身占的2个字节
lengthMap[code[0]] += len(code) + len(sliWord) + 2 + 6
}
}
// 文件头
byteList := make([]byte, 0, 0x6D)
byteList = append(byteList, 0) // 第一个字节可能是最大码长?
// 长度累加
var currNum int
for i := 0; i <= 26; i++ {
currNum += lengthMap[byte(i+0x60)]
currBytes := make([]byte, 4)
binary.LittleEndian.PutUint32(currBytes, uint32(currNum))
byteList = append(byteList, currBytes...)
}
// 替换文件头
ret := buf.Bytes()
copy(ret, byteList)
return ret
}
参考资料:
输入法词库解析(一)百度自定义方案.def的更多相关文章
- 输入法词库解析(四)百度分类词库.bdict(.bcd)
前言 .bdict 是百度的分类词库格式,可以在 https://shurufa.baidu.com/dict 下载. 手机百度的分类词库格式 .bcd 是一样的,可以在 https://mime.b ...
- 输入法词库解析(六)QQ 拼音分类词库.qpyd
详细代码:https://github.com/cxcn/dtool 前言 .qpyd 是 QQ 拼音输入法 6.0 以下版本所用的词库格式,可以在 http://cdict.qq.pinyin.cn ...
- 输入法词库解析(三)紫光拼音词库.uwl
详细代码:https://github.com/cxcn/dtool 前言 .uwl 是紫光拼音输入法(现在叫华宇拼音输入法)使用的词库. 解析 紫光的词库有点复杂,拼音用的索引,但是拼音表没有写在词 ...
- 输入法词库解析(二)搜狗拼音细胞词库.scel(.qcel)
详细代码:https://github.com/cxcn/dtool 前言 .scel 是搜狗拼音输入法所使用的细胞词库格式,可以在 https://pinyin.sogou.com/dict/ 下载 ...
- 输入法词库解析(七)微软用户自定义短语.dat
详细代码:https://github.com/cxcn/dtool 前言 微软拼音和微软五笔通用的用户自定义短语 dat 格式. 解析 前 8 个字节标识文件格式 machxudp,微软五笔的 le ...
- 输入法词库解析(五)极点码表.mb
详细代码:https://github.com/cxcn/dtool 前言 mb 是极点五笔的码表格式. 解析 偏移量 描述 0x00 版本信息 0x1B 码表介绍 0x11F 所用到的按键数 0x1 ...
- paip 自定义输入法多多输入法词库的备份导出以及导入
paip 自定义输入法词库的备份导出以及导入 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.net/ ...
- 用C语言将搜狗输入法词库转换成QQ拼音输入法词库
搜狗输入法词库格式: 'ni'kan'xia 你看下 'ni'kan'xia'gai'hou 你看下改后 'ni'kan'xing'ma 你看行吗 'ni'kan'zen'me'yang 你看怎么样 ...
- 把搜狗输入法词库导入Google拼音输入法
为PC端Google拼音输入法增加词库 为什么折腾词库 都在说百度.讯飞等输入法上传用户词库,为了安全建议大家使用google输入法之类,话说回来,要想使用智能联想功能是不是就得把你输入习惯放在他的里 ...
随机推荐
- Linux操作系统(4):磁盘分区、挂载
Outline: ① lsblk :查看所有设备挂载情况 ② df -h :查询系统整体磁盘使用情况 ③ du -h /目录 :查询指定目录的磁盘占用情况 ④ mount :查询系统中已经挂载的设备 ...
- 攻防世界MISC进阶区 61-63
61.肥宅快乐题 得到swf文件,但是用PotPlayer打不开,用浏览器应该可以打开,打开后可以在npc的对话中看到一段base64 解密后就可以得到flag 62.warmup 得到一张png和一 ...
- 常用源&配置
ubuntu16.04 阿里 cp /etc/apt/sources.list /etc/apt/sources.list.orgin && \ echo "\ deb ht ...
- 是时候优雅的和NullPointException说再见了
是时候优雅的和NullPointException说再见了 ️️️️️️️️️️️️️️️️ 最近在参加原创投稿比赛,本篇文章如果对你有帮助的话,欢迎帮忙点击助力下吧 NullPointExcepti ...
- DHCP原理及配置
DHCP工作原理 集中的管理.分配IP地址,使client动态的获得IP地址.Gateway地址.DNS服务器地址等信息,并能够提升地址的使用率. 简单来说,DHCP就是一个不需要账号密码登录的.自动 ...
- Kafka入门实战教程(7):Kafka Streams
1 关于流处理 流处理平台(Streaming Systems)是处理无限数据集(Unbounded Dataset)的数据处理引擎,而流处理是与批处理(Batch Processing)相对应的.所 ...
- CF1007A Reorder the Array 题解
To CF 这道题是排序贪心,将原序列排序后统计答案即可. 但是直接统计会超时,因为排序后具有单调性,所以可以进行一点优化,这样,便可以通过此题. 而这道题的优化在于单调性,因为 \(a[i+1]\) ...
- WSL2安装Ubuntu20.04
前言:听说WSL2需要Window版本在1904以上(我的window版本是1909,所以未能验证真实性) 启用WSL 控制面板 → 程序 → 程序和功能 → 启用或关闭Windows功能 勾选 适用 ...
- go-zero单体服务使用泛型简化注册Handler路由
一.Golang环境安装及配置Go Module https://go-zero.dev/cn/docs/prepare/golang-install mac OS安装Go# 下载并安装Go for ...
- 面试突击69:TCP 可靠吗?为什么?
相比于 UDP 来说,TCP 的主要特性是三个:有连接.可靠.面向数据流.所谓的"有连接"指的是 TCP 中的连接管理机制,也就是著名的三次握手和四次挥手,就像打电话一样,想要正常 ...