详细代码:https://github.com/nopdan/rose
mb
是极点五笔的码表格式。
偏移量 | 描述 |
---|
0x00 | 版本信息 |
0x1B | 码表介绍 |
0x11F | 所用到的按键数 |
0x120 | 所用到的按键,utf-16le |
0x154 | 万能键 |
0x156 | 编码截止键 |
0x176 | 组词规则 |
0x176 | 组词规则 |
0x194 | 径直上屏的标点 |
0x1B4 | 特殊符号引导符 |
0x1B8 | 未知 |
0x1B620 左右 | 码表 |
上图选中部分解析为
1
2
| 五笔点儿词库2022春 QQ群313225526
生成日期:2022-3-17 18:36
|
所有用到的按键:
组词规则:
特殊符号引导符:
下面的部分就有规律了
每 4 个字节一组,前两个字节表示一个字符,后两个字节从 00 00 ~ 29 00,一共 41 个值(意义不明,可能是某种索引),中间有一些 FF FF FF FF
一直到 0x1B620
左右,有的词库可能会相差几个字节。
下面才是词库部分。
| 占用字节数 | 描述 |
---|
a | 1 | 编码长度 |
b | 1 | 词字节长度 |
| 1 | 只有 0x64、0x32、0x10 几个值,意义不明 |
| a | 编码,ascii |
| b | 词,utf-16le |
代码实现(只读 0x1B620 之后的码表):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| func (JidianMb) Parse(filename string) Table {
data, _ := os.ReadFile(filename)
r := bytes.NewReader(data)
ret := make(Table, 0, r.Len()>>8)
var tmp []byte
r.Seek(0x1B620, 0) // 从 0x1B620 开始读
for r.Len() > 3 {
codeLen, _ := r.ReadByte()
if codeLen == 0xff {
r.Seek(1, 1)
continue
}
wordLen, _ := r.ReadByte()
r.Seek(1, 1)
// 读编码
tmp = make([]byte, codeLen)
r.Read(tmp)
code := string(tmp)
// 读词
tmp = make([]byte, wordLen)
r.Read(tmp)
word, _ := util.Decode(tmp, "UTF-16LE")
ret = append(ret, Entry{word, code, 1})
}
return ret
}
|