如何在内存中将变量内的gzip压缩内容解压至另一变量?
在Tcl内存中直接解压变量内的gzip压缩内容
我通过gzip -k filename生成了带压缩的filename.gz文件并保留原文件,将其上传到服务器后,用以下代码把gz文件内容下载到testvar变量中:
set testvar [exec wget -q -O - url-to-gz-file]; string length $testvar
执行string length $testvar返回了有效数值,现在需要将$testvar内的压缩内容直接在内存中解压到原变量或testvar2变量,得到压缩前的文本文件内容,且不想将.gz文件写入硬盘处理。
解决方案
Tcl字符串原生支持二进制数据,无需额外标记类型,可通过以下两种方式在内存中完成解压:
方法一:通过shell管道快速实现
适合内容较小的场景,利用系统gzip命令通过管道处理:
# 下载压缩内容(原有代码) set testvar [exec wget -q -O - url-to-gz-file] # 内存内解压到testvar2 set testvar2 [exec sh -c "echo -n '\$0' | gzip -d -c" $testvar] # 验证解压结果 puts "解压后内容长度:[string length $testvar2]"
使用sh -c包装命令是为了避免变量中的特殊字符被shell解析,echo -n确保不额外添加换行符,gzip -d -c指定解压并将结果输出到标准输出。
方法二:通过Tcl管道通道(更可靠,支持大内容)
当压缩内容较大时,避免shell参数长度限制,使用Tcl的管道通道处理:
# 下载压缩内容(原有代码) set testvar [exec wget -q -O - url-to-gz-file] # 创建gzip解压管道 set pipe [open "|gzip -d -c" w+] # 写入原始压缩内容(-nonewline避免添加多余换行) puts -nonewline $pipe $testvar flush $pipe # 移动到管道起始位置读取解压结果 seek $pipe 0 start set testvar2 [read $pipe] # 关闭管道 close $pipe # 验证解压结果 puts "解压后内容长度:[string length $testvar2]"
这种方式直接通过Tcl的I/O通道操作,无需依赖shell参数传递,兼容性和稳定性更好。
内容的提问来源于stack exchange,提问作者Hugo Simões
相关产品推荐
相关产品推荐

