详细代码: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. 【RocketMQ】消息的存储

    Broker对消息的处理 BrokerController初始化的过程中,调用registerProcessor方法注册了处理器,在注册处理器的代码中可以看到创建了处理消息发送的处理器对象SendMe ...

  2. DTCC 干货分享:Real Time DaaS - 面向TP+AP业务的数据平台架构

      2021年10月20日,Tapdata 创始人唐建法(TJ)受邀出席 DTCC 2021(中国数据库技术大会),并在企业数据中台设计与实践专场上,发表主旨演讲"Real Time Daa ...

  3. Solution -「构造」专练

    记录全思路过程和正解分析.全思路过程很 navie,不过很下饭不是嘛.会持续更新的(应该). 「CF1521E」Nastia and a Beautiful Matrix Thought. 要把所有数 ...

  4. 树莓派Raspiberry 编译Linux实时内核PREEMPT-RT 实战

    树莓派4B 实时内核(Preempt_RT)的配置和编译https://blog.csdn.net/zlp_zky/article/details/114994444 基本按照这个blog来操作. 几 ...

  5. Javaweb06-JDBC

    1.jdbc.properties配置文件 jdbc.properties driverClass=com.mysql.jdbc.Driver jdbcUrl=jdbc:mysql://localho ...

  6. jQuery基础入门(二)

    jQuery 效果 显示和隐藏 在 jQuery 中可以使用 hide() 和 show() 方法来隐藏和显示 HTML 元素,以及使用 toggle() 方法能够切换 hide() 和 show() ...

  7. ceph 005 赋权补充 rbd块映射

    我的ceph版本 [root@serverc ~]# ceph -v ceph version 16.2.0-117.el8cp (0e34bb74700060ebfaa22d99b7d2cdc037 ...

  8. java-多态、内部类

    1.多态: 1)意义: 1.1)同一类型的引用,指向不同的对象时,有不同的实现-------行为的多态: cut(),run(),teach()... 1.2)同一个对象,被造型为不同的类型时,有不同 ...

  9. as 和 which 引导非限制性定语从句的区别

    定语从句关系代词作用表格:as 和 which 都可以指代整个句子.as 引导非限制性定语从句可以放在主句之前.主句之后.主句之中:which 引导非限制性定语从句只能放在先行词之后. (一)As i ...

  10. IP 地址分类和子网掩码

    IP 地址分类 IP 地址是由 4 组 8 位二进制表示的,格式为:xxxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx.十进制表示的格式为:xxxx.xxxx.xxxx.xxxx, ...