JBu*_*ace 49 powershell base64
我在Powershell中有一个普通字符串,它来自包含Base64文本的文本文件; 它存储在$x.我试图解码它:
$z = [System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String($x));
Run Code Online (Sandbox Code Playgroud)
如果$x是在Powershell中创建的Base64字符串(但事实并非如此),则此方法有效.这不适$x用于来自文件的Base64字符串,$z只是最终结果??.
我错过了什么?例如,$x可能YmxhaGJsYWg=是Base64 for blahblah.
简而言之,YmxhaGJsYWg=是在一个文本文件中,然后在这个Powershell代码中放入一个字符串,我尝试解码它,但最终??等等.
Fro*_* F. 63
是不是编码采用文本TO base64和解码将base64 BACK转换为文本?你好像在混合它们.当我使用这个在线解码器解码时,我得到:
BASE64: blahblah
UTF8: nVnV
Run Code Online (Sandbox Code Playgroud)
而不是相反.我不能完全在PS中重现它.见下面的示例:
PS > [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String("blahblah"))
nV?nV?
PS > [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes("nVnV"))
blZuVg==
Run Code Online (Sandbox Code Playgroud)
编辑现在您已经提出了一个正确的问题,我可以尝试回答它.我相信你的文字使用了错误的编码器.编码的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
Run Code Online (Sandbox Code Playgroud)
mkl*_*nt0 24
目前还没有用于 Base64 转换的 PowerShell 本地命令(从 PowerShell [Core] 7.1 开始),但建议添加专用 cmdlet。
目前,需要直接使用 .NET。
重要:
Base64 编码是一种使用字节的二进制数据编码,其值被限制在表示可打印字符的 ASCII 字符集的明确定义的 64 个字符子范围内,在发送任意字节有问题时设计,尤其是在高位集(字节值 > 0x7f)。
因此,你必须指定明确什么字符编码的Base64编码字节做/应代表。
因此:
在转换为 Base64 时,您必须首先使用Base64 字符串的使用者期望的字符编码获取您尝试编码的字符串的字节表示。
在转换 FROM Base64 时,您必须使用用于创建 Base64 表示的相同编码将结果字节数组解释为字符串。
例子:
笔记:
以下示例与UTF-8编码字符串相互转换:
要与UTF-16LE(“Unicode”)相互转换,请替换[Text.Encoding]::Unicode为[Text.Encoding]::UTF8
转换为 Base64:
PS> [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes('Motörhead'))
TW90w7ZyaGVhZA==
Run Code Online (Sandbox Code Playgroud)
从 Base64 转换:
PS> [Text.Encoding]::Utf8.GetString([Convert]::FromBase64String('TW90w7ZyaGVhZA=='))
Motörhead
Run Code Online (Sandbox Code Playgroud)
and*_*fox 13
如果有人想在 Powershell 中使用管道(如过滤器)来完成此操作(例如读取文件内容并对其进行解码),则可以使用如下的单行代码来实现:
Get-Content base64.txt | %{[Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($_))}
小智 6
我遇到了输出之间显示空格的问题,并且网上根本没有答案可以解决这个问题。我确实花了很多时间试图找到一个解决方案,并通过摆弄代码找到了一个解决方案,以至于我几乎不知道在我让它工作时我输入了什么。这是我对这个问题的修复:[System.Text.Encoding]::UTF8.GetString(([System.Convert]::FromBase64String($base64string)|?{$_}))
小智 5
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时,将显示此页面,因此出于完整性考虑:
$b = [System.Text.Encoding]::UTF8.GetBytes("blahblah")
[System.Convert]::ToBase64String($b)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
119861 次 |
| 最近记录: |