开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 228|回复: 2
收起左侧

[其它源码] 压缩数据、解压数据的自定义实现(仿数据操作支持库)

[复制链接]
结帖率:85% (23/27)
发表于 昨天 17:58 | 显示全部楼层 |阅读模式   湖南省永州市
分享源码
界面截图: -
是否带模块: -
备注说明: -
有些项目需要兼容易语言以前的压缩数据、解压数据(数据操作支持库一),分析了一下封装格式,其实很简单

封装格式:
------------------------------------
[4字节魔数]    0x0D 0x0F 0x3E 0x03
[4字节长度]    原始字节长度(uint32,小端序)
[zlib压缩数据] 标准zlib流(含头78 9C... 尾部adler32)
------------------------------------


这是go代码的实现

[Golang] 纯文本查看 复制代码
package main

import (
        "bytes"
        "compress/zlib"
        "encoding/binary"
        "fmt"
        "io"
        "testing"
        "time"
)

func TestCompress(t *testing.T) {
        original := ".test1test2..."

        // 压缩
        compressed, err := ELanguageCompress([]byte(original))
        if err != nil {
                panic(err)
        }
        //解压
        b, err := ELanguageDecompress(compressed)
        if err != nil {
                panic(err)
        }

        t.Log("解压后文本", string(b))
}

// 固定头部
var magic = []byte{0x0D, 0x0F, 0x3E, 0x03}

// ELanguageCompress 压缩数据
//
// 与易语言的 数据操作支持库一 结果一致
func ELanguageCompress(buf []byte) ([]byte, error) {

        // 使用 zlib 压缩
        var compBuf bytes.Buffer
        zw := zlib.NewWriter(&compBuf)
        _, err := zw.Write(buf)
        if err != nil {
                return nil, err
        }
        // 关闭会刷新并写入 zlib 流尾的 adler32
        if err = zw.Close(); err != nil {
                return nil, err
        }

        // 构造最终字节序列:magic + length(uint32 LE) + zlib bytes
        var outBuf bytes.Buffer
        outBuf.Write(magic)

        // 原始字节长度写为 uint32 小端
        var lenBuf [4]byte
        binary.LittleEndian.PutUint32(lenBuf[:], uint32(len(buf)))
        outBuf.Write(lenBuf[:])

        // 写入 zlib 压缩数据
        outBuf.Write(compBuf.Bytes())

        return outBuf.Bytes(), nil
}

// ELanguageDecompress 解压数据
//
// 与易语言的 数据操作支持库一 结果一致
func ELanguageDecompress(buf []byte) ([]byte, error) {

        // 校验长度与魔数
        if len(buf) < 8 {
                return nil, fmt.Errorf("数据长度不足")
        }
        if !bytes.Equal(buf[:4], magic) {
                return nil, fmt.Errorf("魔数不匹配,非易语言压缩数据")
        }

        // 读取原始长度(虽然通常用不到,但保持一致性)
        dataLen := binary.LittleEndian.Uint32(buf[4:8])
        _ = dataLen // 仅保留供参考

        // Step4: 取出 zlib 数据并解压
        zlibData := buf[8:]
        zr, err := zlib.NewReader(bytes.NewReader(zlibData))
        if err != nil {
                return nil, fmt.Errorf("zlib 解压失败: %v", err)
        }

        defer func() { _ = zr.Close() }()

        decompBytes, err := io.ReadAll(zr)
        if err != nil {
                return nil, fmt.Errorf("读取解压数据失败: %v", err)
        }

        return decompBytes, nil
}


签到天数: 2 天

发表于 昨天 19:22 | 显示全部楼层   黑龙江省哈尔滨市
回复 支持 反对

使用道具 举报

签到天数: 21 天

发表于 昨天 18:29 | 显示全部楼层   新疆维吾尔自治区巴音郭楞蒙古自治州
谢谢分享
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

关闭

精易论坛 - 有你更精彩上一条 /2 下一条

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备2025452707号) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表