How to decode a Base64 string?
Solution 1
Isn't encoding taking the text TO base64 and decoding taking base64 BACK to text? You seem be mixing them up here. When I decode using this online decoder I get:
BASE64: blahblah
UTF8: nVnV
not the other way around. I can't reproduce it completely in PS though. See sample below:
PS > [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String("blahblah"))
nV�nV�
PS > [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes("nVnV"))
blZuVg==
EDIT I believe you're using the wrong encoder for your text. The encoded base64 string is encoded from UTF8(or ASCII) string.
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
Solution 2
There are no PowerShell-native commands for Base64 conversion - yet (as of PowerShell [Core] 7.1), but adding dedicated cmdlets has been suggested in GitHub issue #8620.
For now, direct use of .NET is needed.
Important:
-
Base64 encoding is an encoding of binary data using bytes whose values are constrained to a well-defined 64-character subrange of the ASCII character set representing printable characters, devised at a time when sending arbitrary bytes was problematic, especially with the high bit set (byte values > 0x7f).
-
Therefore, you must always specify explicitly what character encoding the Base64 bytes do / should represent.
Ergo:
-
on converting TO Base64, you must first obtain a byte representation of the string you're trying to encode using the character encoding the consumer of the Base64 string expects.
-
on converting FROM Base64, you must interpret the resultant array of bytes as a string using the same encoding that was used to create the Base64 representation.
Examples:
Note:
-
The following examples convert to and from UTF-8 encoded strings:
-
To convert to and from UTF-16LE ("Unicode") instead, substitute
[Text.Encoding]::Unicode
for[Text.Encoding]::UTF8
Convert TO Base64:
PS> [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes('Motörhead'))
TW90w7ZyaGVhZA==
Convert FROM Base64:
PS> [Text.Encoding]::Utf8.GetString([Convert]::FromBase64String('TW90w7ZyaGVhZA=='))
Motörhead
Solution 3
This page shows up when you google how to convert to base64, so for completeness:
$b = [System.Text.Encoding]::UTF8.GetBytes("blahblah")
[System.Convert]::ToBase64String($b)
Solution 4
Base64 encoding converts three 8-bit bytes (0-255) into four 6-bit bytes (0-63 aka base64). Each of the four bytes indexes an ASCII string which represents the final output as four 8-bit ASCII characters. The indexed string is typically 'A-Za-z0-9+/' with '=' used as padding. This is why encoded data is 4/3 longer.
Base64 decoding is the inverse process. And as one would expect, the decoded data is 3/4 as long.
While base64 encoding can encode plain text, its real benefit is encoding non-printable characters which may be interpreted by transmitting systems as control characters.
I suggest the original poster render $z as bytes with each bit having meaning to the application. Rendering non-printable characters as text typically invokes Unicode which produces glyphs based on your system's localization.
Base64decode("the answer to life the universe and everything") = 00101010
Solution 5
I had issues with spaces showing in between my output and there was no answer online at all to fix this issue. I literally spend many hours trying to find a solution and found one from playing around with the code to the point that I almost did not even know what I typed in at the time that I got it to work. Here is my fix for the issue: [System.Text.Encoding]::UTF8.GetString(([System.Convert]::FromBase64String($base64string)|?{$_}))
Related videos on Youtube
JBurace
Updated on March 25, 2022Comments
-
JBurace about 2 years
I have a normal string in Powershell that is from a text file containing Base64 text; it is stored in
$x
. I am trying to decode it as such:$z = [System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String($x));
This works if
$x
was a Base64 string created in Powershell (but it's not). And this does not work on the$x
Base64 string that came from a file,$z
simply ends up as something like䐲券
.What am I missing? For example,
$x
could beYmxhaGJsYWg=
which is Base64 forblahblah
.In a nutshell,
YmxhaGJsYWg=
is in a text file then put into a string in this Powershell code and I try to decode it but end up with䐲券
etc.-
Roger Lipscombe about 11 yearsBase64-encoded strings will always be longer than the original data. You appear to have something backwards here.
-
JBurace about 11 years@RogerLipscombe Oops, updated.
-
-
JBurace about 11 yearsI already have an encoded string
nVnV
and I'm trying to decode it. That seems backwards to me, "blahblah" is the human readable string I need and "nVnV" is the encoded string I need to decode. -
Frode F. about 11 yearssee updated answer. I can't reproduce it, but I can't figure out how you got "nVnV" (base64) from "blahblah".
-
JBurace about 11 yearsI updated my OP, sorry. Yes, I can do it in 100% Powershell but that's not what I'm doing. The Base64 is coming from a text file.
-
yzorg over 2 years
-
jmjohnson85 over 2 years