如何解码Base64字符串?

时间:2013-03-14 16:19:39

标签: powershell base64

我在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代码中的字符串中,我尝试对其进行解码,但最终得到䐲券等。

5 个答案:

答案 0 :(得分:56)

是不是编码将文本TO base64并解码为base64 BACK到文本?你好像在混合它们。当我使用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

答案 1 :(得分: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

答案 2 :(得分:3)

当您谷歌如何转换为base64时,此页面会显示,所以为了完整性:

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

答案 3 :(得分:2)

还没有用于Base64转换的PowerShell本机命令-(自PowerShell Core 6.2.0起),但是adding dedicated cmdlets has been suggested
目前,需要直接使用.NET。

重要

  • Base64 encoding使用 bytes binary 数据进行编码的 binary ,表示可打印字符的ASCII字符集的-character subrange (在发送任意字节时设计)是有问题的,特别是对于高位集(字节值> 0x7f)。

  • 因此,您必须始终明确指定 Base64字节表示的字符编码

    < / li>

Ergo:

  • 在转换为Base64时,必须首先使用要对Base64的 consumer 进行编码的字符来获取要尝试编码的字符串的字节表示字符串期望。

  • 在从Base64转换时,您必须使用用于创建Base64表示形式的相同编码,将结果字节数组解释为字符串

示例:

注意:

  • 以下示例在 UTF-8 编码的字符串之间进行转换:

  • 要与 UTF-16LE (“ Unicode”)进行相互转换,请用[Text.Encoding]::Unicode代替[Text.Encoding]::UTF8

转换为Base64:

PS> [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes('Motörhead'))
TW90w7ZyaGVhZA==

从Base64转换:

PS> [Text.Encoding]::Utf8.GetString([Convert]::FromBase64String('TW90w7ZyaGVhZA=='))
Motörhead

答案 4 :(得分:1)

我的输出之间出现空格问题,并且根本没有在线答案来解决此问题。我真的花了很多时间试图找到一个解决方案,并找到了一个解决方案的问题,以至于我几乎不知道在我开始工作的时候输入了什么。以下是我对此问题的解决方法:[System.Text.Encoding]::UTF8.GetString(([System.Convert]::FromBase64String($base64string)|?{$_}))