PowerShell Base64编解码函数异常:解码后字符间出现空格问题排查
问题原因及解决办法
核心问题:编码解码字符集不匹配
你的B64函数编码时使用[System.Text.Encoding]::Unicode(即UTF-16双字节编码),但解码时错误选用了[System.Text.Encoding]::ASCII(单字节编码)。
UTF-16编码会将每个字符转换为两个字节(比如字符s会被编码为0x00 0x73),而ASCII解码时会把这两个字节当作独立的ASCII字符处理:其中0x00是不可见的空字符,显示时表现为空格,0x73则对应s,最终就出现了字符间插入空格的异常现象。
修复后的函数代码
将解码部分的ASCII替换为Unicode,保证编码解码使用一致的字符集:
function B64 { [CmdletBinding(DefaultParameterSetName="encString")] param( [Parameter(Position=0, ParameterSetName="encString")] [Alias("es")] [string]$encString, [Parameter(Position=0, ParameterSetName="decString")] [Alias("ds")] [string]$decString ) if ($psCmdlet.ParameterSetName -eq "encString") { $encoded = [Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes($encString)) return $encoded } elseif ($psCmdlet.ParameterSetName -eq "decString") { # 改为与编码一致的Unicode字符集 $decoded = [System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String($decString)) return $decoded } }
调用代码的额外问题修复
原调用代码存在变量错误和文件读写的潜在问题,修复如下:
- 未定义的
$fp变量替换为$filePath - 添加
-Raw参数读取整个文件内容,避免默认按行拆分引入换行符 - 指定
-Encoding utf8写入文件,避免默认编码导致的后续读取异常
修复后的调用代码:
$filePath = "C:\Users\User\Desktop\snp.txt" # 读取完整文件内容 $originalContent = Get-Content $filePath -Raw $encodedContent = B64 -encString $originalContent # 以UTF-8编码写入编码后的内容 $encodedContent | Out-File -FilePath $filePath -Encoding utf8 Start-Sleep -Seconds 1 # 重新读取编码内容 $encodedData = Get-Content $filePath -Raw $decodedContent = B64 -ds $encodedData $decodedContent | Out-File -FilePath $filePath -Encoding utf8
内容的提问来源于stack exchange,提问作者I am Jakoby
相关产品推荐
相关产品推荐

