2013-03-14 121 views
30

我在Powershell中有一個來自包含Base64文本的文本文件的普通字符串;它存儲在$x。我想它是這樣解碼:如何解碼Base64字符串?

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

如果$x是在PowerShell中創建一個Base64字符串,它的工作原理(但它不是)。而這對於來自文件的$x Base64字符串不起作用,$z只是簡單地結束爲䐲券

我錯過了什麼?例如,$x可能是YmxhaGJsYWg=,它是blahblah的Base64。

在nuthshell,YmxhaGJsYWg=是一個文本文件,然後放入這個PowerShell代碼串,我嘗試將其解碼但䐲券

+0

Base64編碼字符串將始終比原始數據。你似乎在這裏倒退了一些東西。 – 2013-03-14 17:37:52

+0

@RogerLipscombe糟糕,已更新。 – JBurace 2013-03-14 17:40:12

回答

35

最終是不是編碼服用文本爲Base64和解碼將base64返回到文本?你似乎在這裏混合起來。當我解碼使用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 
+0

我已經有一個編碼的字符串'nVnV',我試圖解碼它。這似乎對我來說,「blahblah」是我需要的人類可讀字符串,「nVnV」是我需要解碼的編碼字符串。 – JBurace 2013-03-14 17:09:00

+0

查看更新的答案。我無法複製它,但我無法弄清楚你是如何從「blahblah」獲得「nVnV」(base64)的。 – 2013-03-14 17:35:18

+0

我更新了我的OP,對不起。是的,我可以在100%PowerShell中做到這一點,但那不是我正在做的事情。 Base64來自一個文本文件。 – JBurace 2013-03-14 17:40:46

3

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

0

我有問題,用空格顯示我的輸出之間並沒有答案在網上都來解決這個問題。我花了很多時間試圖找到一個解決方案,並發現一個人玩弄代碼,直到我開始工作的時候,我幾乎不知道我輸入了什麼。這是我對這個問題的解決辦法:[System.Text.Encoding]::UTF8.GetString(([System.Convert]::FromBase64String($base64string)|?{$_}))

0

本頁面顯示出來,當你谷歌如何轉換爲Base64,所以對於完整性:

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