如何在PowerShell中使用ZLibStream类压缩字符串?
在PowerShell中使用ZlibStream实现Zlib格式字符串压缩
可以使用ZlibStream类实现标准Zlib格式的字符串压缩,这正是解决你之前用GZipStream/DeflateStream无法被外部系统解码问题的核心原因:
GZipStream生成的是带GZip专属头和CRC校验的格式,不符合Zlib标准;DeflateStream仅输出原始Deflate压缩数据,缺少Zlib规范要求的头信息和校验字段;ZlibStream直接生成符合Zlib标准的压缩数据,能被绝大多数依赖Zlib格式的外部系统正确解码。
注意事项
ZlibStream是.NET 6及以上版本引入的类,因此需要使用PowerShell 7.x(基于.NET 6+),Windows PowerShell 5.1基于.NET Framework,不支持该类。
修正后的PowerShell脚本
以下是直接写入字节数组的实现方式(编码明确,避免歧义):
$stringToCompress = 'string to compress' $encoding = [System.Text.Encoding]::UTF8 # 使用using语句自动释放资源(PowerShell 7+支持) using ($memStream = [System.IO.MemoryStream]::new()) { using ($zlibStream = [System.IO.Compression.ZlibStream]::new($memStream, [System.IO.Compression.CompressionMode]::Compress)) { # 将字符串转换为指定编码的字节数组 $rawBytes = $encoding.GetBytes($stringToCompress) # 写入压缩流 $zlibStream.Write($rawBytes, 0, $rawBytes.Length) # 完成压缩并确保所有数据写入内存流 $zlibStream.FlushFinalBlock() } # 将压缩后的字节数组转换为Base64字符串输出 $encodedCompressedString = [System.Convert]::ToBase64String($memStream.ToArray()) Write-Output $encodedCompressedString }
如果你更习惯使用StreamWriter,也可以用以下写法:
$stringToCompress = 'string to compress' $memStream = New-Object System.IO.MemoryStream try { $zlibStream = New-Object System.IO.Compression.ZlibStream($memStream, [System.IO.Compression.CompressionMode]::Compress) # 显式指定编码避免默认编码差异 $streamWriter = New-Object System.IO.StreamWriter($zlibStream, [System.Text.Encoding]::UTF8) $streamWriter.Write($stringToCompress) $streamWriter.Flush() $zlibStream.FlushFinalBlock() $encodedCompressedString = [System.Convert]::ToBase64String($memStream.ToArray()) Write-Output $encodedCompressedString } finally { # 手动释放所有流资源 $streamWriter.Close() $zlibStream.Close() $memStream.Close() }
内容的提问来源于stack exchange,提问作者John Smith
相关产品推荐
相关产品推荐

