马上注册,结交更多易友,享用更多功能,让你轻松玩转觅风论坛。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
hp-socket实现WS_流式解压源码分享
- .版本 2
- .支持库 spec
- .子程序 WS_流式解压, 字节集, 公开
- .参数 压缩数据, 字节集, 参考
- .局部变量 pZlib, 整数型
- .局部变量 输出缓冲区, 字节集
- .局部变量 结果码, 整数型
- .局部变量 预估大小, 整数型
- .局部变量 补尾数据, 字节集
- .局部变量 已写入长度, 整数型
- .如果真 (取字节集长度 (压缩数据) = 0)
- 返回 ({ })
- .如果真结束
- 预估大小 = 取字节集长度 (压缩数据) × 10
- 输出缓冲区 = 取空白字节集 (预估大小)
- ' 1. 完整初始化(堆分配 + zlib内部状态创建)
- pZlib = 申请内存_ (56)
- _inflateInit2 (pZlib, -15, _zlibVersion (), 56)
- ' 2. 预分配缓冲区一次性解压
- ' 填写 z_stream 结构体字段
- _Set (pZlib, 0, 取变量数据地址 (压缩数据)) ' strm.next_in
- _Set (pZlib, 4, 取字节集长度 (压缩数据)) ' strm.avail_in
- _Set (pZlib, 12, 取变量数据地址 (输出缓冲区)) ' strm.next_out
- _Set (pZlib, 16, 预估大小) ' strm.avail_out
- 结果码 = _inflate (pZlib, #Z_FLUSH_SYNC_FLUSH)
- ' RFC 7692 标准补尾,刷出全部残留数据
- .如果真 (结果码 = #Z_ERROR_OK)
- 补尾数据 = { 0, 0, 255, 255 }
- _Set (pZlib, 0, 取变量数据地址 (补尾数据)) ' strm.next_in
- _Set (pZlib, 4, 4) ' strm.avail_in
- 结果码 = _inflate (pZlib, #Z_FLUSH_SYNC_FLUSH)
- .如果真结束
- ' 3. 释放资源
- _inflateEnd (pZlib)
- ' 4. 返回结果
- 已写入长度 = 预估大小 - _Get (pZlib, 16) ' strm.avail_out
- 释放内存_ (pZlib)
- .如果真 (已写入长度 > 0)
- 返回 (取字节集左边 (输出缓冲区, 已写入长度))
- .如果真结束
- 返回 ({ })
- .版本 2
- .DLL命令 _inflateInit2, 整数型, "zlib1.dll", "@inflateInit2_"
- .参数 strm, 整数型
- .参数 windowBits, 整数型
- .参数 version, 文本型
- .参数 stream_size, 整数型
- .DLL命令 _zlibVersion, 文本型, "zlib1.dll", "@zlibVersion"
- .DLL命令 _inflate, 整数型, "zlib1.dll", "@inflate"
- .参数 strm, 整数型
- .参数 flush, 整数型
- .DLL命令 _inflateEnd, 整数型, "zlib1.dll", "@inflateEnd"
- .参数 strm, 整数型
- .版本 2
- .常量 Z_FLUSH_SYNC_FLUSH, "2"
- .常量 Z_ERROR_OK, "0"
复制代码
|