如何按rfc1951规范解压deflate/zlib数据?求Red语言decompress/deflate用法示例
错误原因
你遇到的崩溃是参数使用错误导致的:Red的decompress/deflate接口不需要手动传入原始数据长度作为第二个参数,你传入的326会被程序识别为内存地址进行访问,因此触发了「无效虚拟地址」的运行时错误。
正确使用示例
/deflate限定词专门用于处理符合RFC1951规范的纯deflate裸流(无zlib头、无gzip封装,对应你用到的zlib-flate -uncompress命令处理的流格式),正确写法不需要额外参数:
; 首先验证b1是合法的deflate裸流后,直接执行 decompress/deflate b1
完整可运行的加解压验证示例如下:
>> origin: to binary! "Red语言deflate解压测试内容" == #{526564E8AFADE8A8806465666C617465E8A7E3E58E8BE6B58BE8AF95E58685E5AEB9} ; 压缩为纯deflate裸流 >> compressed: compress/deflate origin == #{534AC94C5370492C294D7548CECF4D2D49C928CECF4D730632979AB2B738050062E909A81A999A9159899B5799925A1498385950B00} ; 解压纯deflate裸流 >> decompressed: decompress/deflate compressed == #{526564E8AFADE8A8806465666C617465E8A7E3E58E8BE6B58BE8AF95E58685E5AEB9} >> to string! decompressed == "Red语言deflate解压测试内容"
如果你的压缩流是带zlib封装的RFC1950格式,直接使用不带限定词的decompress即可:
>> zlib_compressed: compress origin == #{789C534AC94C5370492C294D7548CECF4D2D49C928CECF4D730632979AB2B738050062E909A81A999A9159899B5799925A1498385950B0035830C7F} >> to string! decompress zlib_compressed == "Red语言deflate解压测试内容"
注意事项
- 仅当确认待解压的二进制流是无任何封装的纯RFC1951裸流时,才需要加
/deflate限定词 - 不需要手动传入任何长度参数,Red的解压接口会自动解析流内容
- 若按上述写法仍出现错误,可先通过
zlib-flate -uncompress命令验证待解压的流本身合法有效
内容的提问来源于stack exchange,提问作者user16861490
相关产品推荐
相关产品推荐

