如何在PowerShell中从Unicode字符串还原原始字节序列?
问题分析与解决方案
问题根源
你使用的[System.Text.Encoding]::Unicode(即UTF-16编码)在处理无效字节序列时会自动替换无效内容:当原始字节无法对应合法的Unicode码点时,GetString方法会将这些无效序列替换为替换字符U+FFFD(对应字节239,191,189)。后续调用GetBytes时,这些位置会输出替换字符的字节,而非原始字节,因此无法还原。
你的原始$bytes数组中包含多组无效的UTF-16字节组合(比如239,174、217,221等),这些组合无法映射到合法的Unicode码点,导致编码转换时数据丢失。
无损还原解决方案
要实现二进制字节与字符串的无损转换,不能使用文本编码(如UTF-16),而应使用Base64编码——它专门用于将任意二进制数据转换为纯文本字符,不会修改或丢失原始数据。
实现代码
$bytes = [byte[]]@(239,174,61,217,221,117,215,174,248,221,253,56,219,126,53,221,189,122,211,157,26,231,126,57,50,0) # 将原始字节转换为Base64字符串(无损中转) $base64String = [Convert]::ToBase64String($bytes) # 从Base64字符串还原原始字节 $bytes2 = [Convert]::FromBase64String($base64String) # 对比验证结果 cls [string]::Join(',', $bytes) [string]::Join(',', $bytes2)
原理说明
Base64通过将每3个字节转换为4个可打印ASCII字符的方式,实现二进制到文本的映射,整个过程不会对原始字节做任何语义解析或修改,因此能100%还原原始数据。
内容的提问来源于stack exchange,提问作者Carsten
相关产品推荐
相关产品推荐

