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

前言

.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
}

参考资料:

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. 【UR #2】猪猪侠再战括号序列 题解

    题目链接 前言 是的没脑子选手只会做签到题. 思路分析 一开始把题目看成反转括号的状态,直接浪费 \(40\ mins\) . 我们考虑把不确定的"正确括号"转换成一个固定的括号序 ...

  2. Harbor-私有镜像仓库的安装部署

    Harbor 安装条件 官网给出了安装需要的最低硬件和软件的条件:https://goharbor.io/docs/2.0.0/install-config/installation-prereqs/ ...

  3. 【问题解决】Axios调用文件下载获取不到文件名

    问题描述 自己开发了一个后端下载文件的接口,然后通过浏览器直接访问这个接口,浏览器能正确得到文件名并下载: 而使用Axios时发现获取不到,经过打印响应体发现响应头里没有文件名 而Java后端代码里是 ...

  4. 001 Security概述

    1.Spring Security概述 Spring Security是用于解决认证与授权的框架 SpringSecurity默认要求所有的请求都是必须先登录才允许的访问 BCrypt加密算法 BCr ...

  5. 05 MySQL_主键约束

    主键约束 主键: 用于表示数据唯一性的字段称为主键: 约束:就是对表字段添加限制条件 主键约束:保证主键字段的值唯一且非空: - 格式 : create table t1(id int primary ...

  6. Java中修饰符的分类及用法

    访问权限修饰符: public 修饰class,方法,变量: 所修饰类的名字必须与文件名相同,文件中最多能有一个pulic修饰的类. private class不可用,方法,变量可以用: 只限于本类成 ...

  7. $\mathcal{A\,F\,O}$

    突然间,告诉我不用学计算机了 真的有点像是做梦 回忆自己的OI生涯 真的不知从何说起 小学的时候 被家长哄着报名了当时很热门的 logo语言 在炎热的夏天,电脑里小海龟的步伐从未停歇 那时的自己很骄傲 ...

  8. Vxe-table 高亮当前行

    需求 1 :设置初始高亮 子组件: 父组件 需求 2 :高亮行的变化,需要把数据传递到兄弟组件中 解决办法:EventBus 参考链接: http://t.csdn.cn/iwOJc main.js ...

  9. .netcore 定制化项目开发的思考和实现

    今年年初进了一家新公司,进入之后一边维护老项目一边了解项目流程,为了接下来的项目重做积累点经验. 先说下老项目吧,.net fx 3.5+oracle...... 在实际维护中逐渐发现,老项目有标准版 ...

  10. Vue 自定义事件 && 组件通信

    1 App.vue 2 <template> 3 <!-- 4 组件的自定义事件: 5 1.一种组件间通信的方式,使用于:子组件===>父组件 6 2.使用场景:A是父组件,B ...