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

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

前言

微软拼音和微软五笔通用的用户自定义短语 dat 格式。

解析

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

前 8 个字节标识文件格式 machxudp,微软五笔的 lex 格式是 imscwubi

下面 8 个字节应该是版本号。

接下来每 4 字节一组,分别表示 偏移表开始词条开始文件总长词条数导出的时间戳

然后补 0 一直到 偏移表开始

偏移表记录了每个词条从词条开始的偏移量,每 4 个字节一组。

接下来就是词条本体部分:

占用字节数 描述 4 10 00 10 00

标记 a 2 该词条总字节长 – 词占用的字节长 1 在候选中的位置 1 0x06 0x13

,未知 4 0 4 从 2010-01-01

开始的时间戳 a – 16 编码(utf-16le),00 标识结束 词条总字节长 – a 词(utf-16le),00 标识结束

代码实现:

func (MsUDP) Parse(filename string) Table {
    data, _ := os.ReadFile(filename)
    r := bytes.NewReader(data)
    ret := make(Table, 0, r.Len()>>8)

    // 词库偏移量
    r.Seek(0x10, 0)
    offset_start := ReadUint32(r) // 偏移表开始
    entry_start := ReadUint32(r)  // 词条开始
    entry_end := ReadUint32(r)    // 词条结束
    entry_count := ReadUint32(r)  // 词条数
    export_time := ReadUint32(r)  // 导出的时间
    t := time.Unix(int64(export_time), 0)
    fmt.Println(t, entry_end)

    // 第一个偏移量
    offset := 0
    for i := 0; i < entry_count; i++ {
        var next, length int
        if i == entry_count-1 {
            length = entry_end - entry_start - offset
        } else {
            r.Seek(int64(offset_start+4*(i+1)), 0)
            next = ReadUint32(r)
            length = next - offset
        }
        // fmt.Println(offset, next, length)

        r.Seek(int64(offset+entry_start), 0)
        offset = next
        ReadUint32(r)            // 0x10001000
        codeLen := ReadUint16(r) // 编码字节长+0x12
        order, _ := r.ReadByte() // 顺序
        _, _ = r.ReadByte()      // 0x06 不明
        ReadUint32(r)            // 4 个空字节
        ReadUint32(r)            // 时间戳
        tmp := make([]byte, codeLen-0x12)
        r.Read(tmp)
        code, _ := util.Decode(tmp, "UTF-16LE")
        ReadUint16(r) // 两个空字节
        tmp = make([]byte, length-codeLen-2)
        r.Read(tmp)
        word, _ := util.Decode(tmp, "UTF-16LE")
        fmt.Println(code, word)
        ret = append(ret, Entry{word, code, order})
    }
    return ret
}

生成

只需注意 &#x6587;&#x4EF6;&#x603B;&#x957F;先用空字节代替,最后才写入。

代码实现:

func (MsUDP) Gen(table Table) []byte {
    var buf bytes.Buffer
    stamp := util.GetUint32(int(time.Now().Unix()))
    buf.Write([]byte{0x6D, 0x73, 0x63, 0x68, 0x78, 0x75, 0x64, 0x70,
        0x02, 0x00, 0x60, 0x00, 0x01, 0x00, 0x00, 0x00})
    buf.Write(util.GetUint32(0x40))
    buf.Write(util.GetUint32(0x40 + 4*len(table)))
    buf.Write(make([]byte, 4)) // 待定 文件总长
    buf.Write(util.GetUint32(len(table)))
    buf.Write(stamp)
    buf.Write(make([]byte, 28))
    buf.Write(make([]byte, 4))

    words := make([][]byte, 0, len(table))
    codes := make([][]byte, 0, len(table))
    sum := 0
    for i := range table {
        word, _ := util.Encode([]byte(table[i].Word), "UTF-16LE")
        code, _ := util.Encode([]byte(table[i].Code), "UTF-16LE")
        words = append(words, word)
        codes = append(codes, code)
        if i != len(table)-1 {
            sum += len(word) + len(code) + 20
            buf.Write(util.GetUint32(sum))
        }
    }
    for i := range table {
        buf.Write([]byte{0x10, 0x00, 0x10, 0x00})
        // fmt.Println(words[i], len(words[i]), codes[i], len(codes[i]))
        buf.Write(util.GetUint16(len(codes[i]) + 18))
        buf.WriteByte(table[i].Order)
        buf.WriteByte(0x06)
        buf.Write(make([]byte, 4))
        buf.Write(stamp)
        buf.Write(codes[i])
        buf.Write([]byte{0, 0})
        buf.Write(words[i])
        buf.Write([]byte{0, 0})
    }
    b := buf.Bytes()
    copy(b[0x18:0x1c], util.GetUint32(len(b)))
    return b
}

Original: https://www.cnblogs.com/cxcn/p/16702359.html
Author: 单单本单
Title: 输入法词库解析(七)微软用户自定义短语.dat

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/802480/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Python学习笔记: pip install 常见错误汇总

    本机环境RHEL8, Python3.9 在pypi上查看pkg的页面,因为有些pip包的版本对特定的python版本有要求 src/kerberos.c:18:10: fatal…

    Python 2023年6月10日
    0107
  • matplotlib自己学习记录

    matplotlib学习笔记 基本语法 基础plt import matplotlib.pyplot as plt import numpy as np x = np.linspa…

    Python 2023年9月1日
    051
  • 用Python来表白,把情书写进她的照片里

    前言 这不已经十一月了,22年马上就过完了,各位兄弟有对象了吗,现在就是缺钱还缺对象 退一步来说,有心仪的人吗啊,如果有的话,看看这篇 程序员的表白小妙招吧 ; 实现步骤 想要实现…

    Python 2023年9月28日
    062
  • python-爬虫-scrapy框架

    Scrapy,Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于 抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数 据挖掘、监测和自动化测…

    Python 2023年10月1日
    033
  • 运用selenium库写淘宝抢购详解【3】(文末附带源码)

    #每日一更【3】 今天讲的是用selenium库写一个淘宝抢购程序,10.19亲测可用 1.淘宝抢购的思路和上一篇的思路类似,通过打开浏览器筛选浏览器内的标签,并点击来实现自动化 …

    Python 2023年10月10日
    055
  • python画圆角矩形_Python图像库(PIL)绘图——带渐变的圆角矩形

    这是一种非常野蛮的方法,但它能完成任务。生成渐变的代码是从here中借用的。from PIL import Image, ImageDraw def channel(i, c, s…

    Python 2023年9月22日
    059
  • Seata 1.5.2 源码学习

    文章有点长,我决定用半个小时来和你分享~😂 废话不多说,上代码。。。 基于Seata 1.5.2,项目中用 seata-spring-boot-starter SeataDataS…

    Python 2023年10月15日
    037
  • KNN算法推理与实现

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 弹尽粮绝,会员救园:…

    Python 2023年10月25日
    040
  • KNN算法详解

    title: “KNN算法详解”date: 2022-01-01T11:20:23+08:00lastmod: 2022-01-01T13:20:23+08…

    Python 2023年8月1日
    075
  • 用python写一个俄罗斯方块小游戏

    好的,下面是一个简单的 俄罗斯 方块_小 _游戏_的 _Python_代码示例,基于Pygame库: ` _python import pygame import random p…

    Python 2023年9月24日
    041
  • 打穿你的内网之三层内网渗透

    引言 ​ 在过去的一些实战经历中发现自己内网相关的技能还比较薄弱,所以专门找了个靶场(teamssix.com)做下练习,靶场的web漏洞利用都很简单,主要训练自己内网搭代理隧道的…

    Python 2023年10月21日
    071
  • Bert不完全手册2. Bert不能做NLG?MASS/UNILM/BART

    Bert通过双向LM处理语言理解问题,GPT则通过单向LM解决生成问题,那如果既想拥有BERT的双向理解能力,又想做生成嘞?成年人才不要做选择!这类需求,主要包括seq2seq中生…

    Python 2023年10月28日
    032
  • Python3 [集合]类型 学习笔记

    Python集合学习笔记 一、基本知识: 1、 集合(set):是一个 无序的、不重复的 元素序列。 2、 集合的创建:使用 { } 或者 set( )函数创建集合。 (1) 创建…

    Python 2023年5月25日
    087
  • 【Tensorflow】结果可复现设置-随机种子设置(Random Seed)

    引言 设置 引言 在进行深度学习实验的时候,可能经常会发现,虽然输入的数据都是一样的,但是输出的结果总是会有不同的波动,这主要是由于在神经网络中,很多网络层参数的初始化会涉及到随机…

    Python 2023年10月25日
    041
  • Pandas的应用-1

    Pandas是Wes McKinney在2008年开发的一个强大的分析结构化数据的工具集。Pandas以NumPy为基础(数据表示和运算),提供了用于数据处理的函数和方法,对数据分…

    Python 2023年8月22日
    041
  • 【Django+Apscheduler 开发定时任务模块】【二】

    Django+Apscheduler 开发定时任务模块 目录 * 一、回顾 二、安装Apscheduler 三、编写存储定时任务的model 四、展示 目录 &#x672C…

    Python 2023年8月6日
    075
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球