81

我在 Powershell 中有一个来自包含 Base64 文本的文本文件的普通字符串;它存储在$x. 我试图这样解码它:

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

如果$x是在 Powershell 中创建的 Base64 字符串,则此方法有效(但不是)。这不适$x用于来自文件的 Base64 字符串,$z只是以䐲券.

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

简而言之,YmxhaGJsYWg=是在一个文本文件中,然后在这个 Powershell 代码中放入一个字符串,我尝试对其进行解码,但最终得到䐲券等。

4

6 回答 6

119

编码不是将文本转为 base64,解码不是将 base64 转回文本吗?你似乎把它们混在一起了。当我使用这个在线解码器解码时,我得到:

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
于 2013-03-14T17:06:13.033 回答
32

没有用于 Base64 转换的 PowerShell 原生命令(从 PowerShell [Core] 7.1 开始),但在GitHub 问题 #8620中建议添加专用 cmdlet 。
目前,需要直接使用 .NET。

重要

  • Base64 编码是使用字节二进制数据进行编码,其值被限制在表示可打印字符的 ASCII 字符集的明确定义的 64 字符子范围内,设计时发送任意字节存在问题,尤其是高位集 (字节值 > 0x7f)。

  • 因此,您必须始终明确指定Base64 字节应该/应该代表什么字符编码

尔格:

  • 转换为 Base64时,您必须首先使用 Base64 字符串的使用者期望的字符编码来获取您尝试编码的字符串的字节表示。

  • 从 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
于 2019-04-14T22:02:20.120 回答
8

当您在谷歌上搜索如何转换为 base64 时会显示此页面,因此为了完整起见:

$b  = [System.Text.Encoding]::UTF8.GetBytes("blahblah")
[System.Convert]::ToBase64String($b)
于 2017-08-28T06:55:20.833 回答
5

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

于 2014-12-24T15:38:37.843 回答
4

我的输出之间出现空格问题,并且根本没有在线答案来解决这个问题。我确实花了很多时间试图找到一个解决方案,并从玩弄代码到我几乎不知道在我让它工作时输入了什么的地步找到了一个解决方案。这是我对这个问题的修复:[System.Text.Encoding]::UTF8.GetString(([System.Convert]::FromBase64String($base64string)|?{$_}))

于 2016-04-29T07:49:25.897 回答
1

仍然不是“内置”,而是发布到画廊,由 MS 撰写:

https://github.com/powershell/textutility

文本实用程序

  • ConvertFrom-Base64
    返回从 base64 解码的字符串。
  • ConvertTo-Base64
    返回字符串的 base64 编码表示。
于 2021-09-20T17:34:49.637 回答