我在Powershell中有一个普通字符串,它来自包含Base64文本的文本文件;它存储在 $x
中 . 我试图解码它:
$z = [System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String($x));
如果 $x
是在Powershell中创建的Base64字符串(但事实并非如此),则此方法有效 . 这对于来自文件的 $x
Base64字符串不起作用, $z
最终会像 䐲券
那样结束 .
我错过了什么?例如, $x
可以是 YmxhaGJsYWg=
,这是 blahblah
的Base64 .
简而言之, YmxhaGJsYWg=
在一个文本文件中,然后放入这个Powershell代码中的字符串,我尝试解码它,但最终得到 䐲券
等 .
4 回答
Base64编码将三个8位字节(0-255)转换为四个6位字节(0-63又称base64) . 四个字节中的每一个都将ASCII字符串索引,该字符串将最终输出表示为四个8位ASCII字符 . 索引字符串通常是'A-Za-z0-9 /',其中'='用作填充 . 这就是编码数据长4/3的原因 .
Base64解码是逆过程 . 正如人们所预料的那样,解码数据的长度为3/4 .
虽然base64编码可以编码纯文本,但它的真正好处是编码不可打印的字符,这些字符可以通过将系统作为控制字符进行解释 .
我建议原始海报将$ z渲染为字节,每个位对应用程序都有意义 . 将不可打印的字符呈现为文本通常会调用Unicode,这会根据系统的本地化生成字形 .
Base64decode(“生命的答案宇宙和一切”)= 00101010
当您谷歌如何转换为base64时,此页面会显示,所以为了完整性:
是不是编码采用文本TO base64和解码将base64 BACK转换为文本?你好像在混合它们 . 当我使用this online decoder解码时,我得到:
而不是相反 . 我不能完全在PS中重现它 . 见下面的示例:
EDIT 现在你've come up with a proper question, I can try to answer it. I believe you'为你的文字使用了错误的编码器 . 编码的base64字符串由UTF8(或ASCII)字符串编码 .
我在输出之间显示空格问题,并且根本没有在线答案来解决此问题 . 我真的花了很多时间试图找到一个解决方案,并找到了一个解决方案的问题,以至于我几乎不知道在我开始工作的时候输入了什么 . 以下是我对此问题的解决方法:
[System.Text.Encoding]::UTF8.GetString(([System.Convert]::FromBase64String($base64string)|?{$_}))