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