如何在PowerShell中实现Shell的十六进制字符串转原字符串功能
在PowerShell中将十六进制字符串还原为原文本
要实现和Shell中echo -ne等价的功能,把十六进制字符串$sign_nist还原为“signing key”,需要将十六进制字符串转换为字节数组,再解码为文本。以下是正确的实现方式:
完整代码示例
$sign_nist = "000000017369676E696E67206B65790000000100" # 1. 将十六进制字符串按每两个字符分割,过滤空值 $hexByteSegments = $sign_nist -split '(..)' | Where-Object { $_ } # 2. 转换为字节数组 $byteArray = [byte[]]($hexByteSegments | ForEach-Object { [Convert]::ToByte($_, 16) }) # 3. 将字节数组解码为ASCII字符串,去除前后空字节(0x00) $decodedString = [System.Text.Encoding]::ASCII.GetString($byteArray).Trim([char]0) # 输出结果 $decodedString
执行后会输出:
signing key
错误原因分析
你之前的代码错误在于将每个十六进制片段转换为UInt32后直接拼接字符串,这只是把字节的十进制数值连在一起,并没有将字节解码为对应的ASCII字符,因此得到的是一串数字组合而非原文本。
简化写法(正则匹配)
也可以用正则表达式直接提取所有两个字符的十六进制片段,代码更简洁:
$sign_nist = "000000017369676E696E67206B65790000000100" $hexByteSegments = [regex]::Matches($sign_nist, '..') | ForEach-Object { $_.Value } $byteArray = [byte[]]($hexByteSegments | ForEach-Object { [Convert]::ToByte($_, 16) }) $decodedString = [System.Text.Encoding]::ASCII.GetString($byteArray).Trim([char]0) $decodedString
关键说明
- 分割十六进制字符串:无论是
-split '(..)'还是正则匹配,都是为了把连续的十六进制字符串拆分为单个字节的十六进制表示(每两个字符对应一个字节)。 - 字节转换:
[Convert]::ToByte($_, 16)将十六进制字符串转换为单个字节值,最终组成字节数组。 - 字符串解码:使用
ASCII编码是因为原文本“signing key”属于ASCII字符集;如果涉及非ASCII字符,可根据实际情况改用UTF8或其他编码。 - 去除空字节:原
$sign_nist前后包含多个00(空字节),这些字节在终端中不可见,通过Trim([char]0)可以剔除前后的空字节,得到干净的目标文本。
内容的提问来源于stack exchange,提问作者Siva Phaneesh
相关产品推荐
相关产品推荐

