2013-03-14 108 views
30

我在Powershell中有一个来自包含Base64文本的文本文件的普通字符串;它存储在$x。我想它是这样解码:如何解码Base64字符串?

$z = [System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String($x)); 

如果$x是在PowerShell中创建一个Base64字符串,它的工作原理(但它不是)。而这对于来自文件的$x Base64字符串不起作用,$z只是简单地结束为䐲券

我错过了什么?例如,$x可能是YmxhaGJsYWg=,它是blahblah的Base64。

在nuthshell,YmxhaGJsYWg=是一个文本文件,然后放入这个PowerShell代码串,我尝试将其解码但䐲券

+0

Base64编码字符串将始终比原始数据。你似乎在这里倒退了一些东西。 – 2013-03-14 17:37:52

+0

@RogerLipscombe糟糕,已更新。 – JBurace 2013-03-14 17:40:12

回答

35

最终是不是编码服用文本为Base64和解码将base64返回到文本?你似乎在这里混合起来。当我解码使用this online decoder我得到:

BASE64: blahblah 
UTF8: nVnV 

不是相反。虽然我不能在PS中完全重现它。见下面的示例:

PS > [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String("blahblah")) 
nV�nV� 

PS > [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes("nVnV")) 
blZuVg== 

编辑现在,你已经来到了一个正确的问题,我可以尝试回答。我相信你的文字使用了错误的编码器。编码的base64字符串是使用UTF8(或ASCII)字符串编码的。

PS > [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String("YmxhaGJsYWg=")) 
blahblah 

PS > [System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String("YmxhaGJsYWg=")) 
汢桡汢桡 

PS > [System.Text.Encoding]::ASCII.GetString([System.Convert]::FromBase64String("YmxhaGJsYWg=")) 
blahblah 
+0

我已经有一个编码的字符串'nVnV',我试图解码它。这似乎对我来说,“blahblah”是我需要的人类可读字符串,“nVnV”是我需要解码的编码字符串。 – JBurace 2013-03-14 17:09:00

+0

查看更新的答案。我无法复制它,但我无法弄清楚你是如何从“blahblah”获得“nVnV”(base64)的。 – 2013-03-14 17:35:18

+0

我更新了我的OP,对不起。是的,我可以在100%PowerShell中做到这一点,但那不是我正在做的事情。 Base64来自一个文本文件。 – JBurace 2013-03-14 17:40:46

3

Base64编码将三个8位字节(0-255)转换为四个6位字节(0-63 aka base64)。四个字节中的每一个都将表示最终输出的ASCII字符串索引为四个8位ASCII字符。索引字符串通常是'A-Za-z0-9 + /','='用作填充。这就是编码数据长4/3的原因。

Base64解码是相反的过程。正如人们所期望的那样,解码数据的长度是3/4。

尽管base64编码可以对纯文本进行编码,但其真正的好处是编码不可打印的字符,这可以通过将系统作为控制字符来解释。

我建议原始海报渲染$ z作为字节,每个位对应用程序都有意义。将不可打印字符呈现为文本通常会调用Unicode,从而根据系统的本地化生成字形。

Base64decode(“生活的答案宇宙和一切”)= 00101010

0

我有问题,用空格显示我的输出之间并没有答案在网上都来解决这个问题。我花了很多时间试图找到一个解决方案,并发现一个人玩弄代码,直到我开始工作的时候,我几乎不知道我输入了什么。这是我对这个问题的解决办法:[System.Text.Encoding]::UTF8.GetString(([System.Convert]::FromBase64String($base64string)|?{$_}))

0

本页面显示出来,当你谷歌如何转换为Base64,所以对于完整性:

$b = [System.Text.Encoding]::UTF8.GetBytes("blahblah") 
[System.Convert]::ToBase64String($b)