2013-03-14 13 views
30

Powershellには、Base64テキストを含むテキストファイルの通常の文字列があります。 $xに格納されます。 $xはPowerShellで作成されたBase64文字列だった場合に動作Base64文字列をデコードする方法は?

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

を(しかし、そうではありません):私はそのように解読しようとしています。そして、これはファイルから来た$x Base64文字列では機能しません。$zは単に䐲券のようになります。

私には何が欠けていますか?例えば、$xYmxhaGJsYWg=であり、これはblahblahのBase64です。その後、nuthshellで

YmxhaGJsYWg=はテキストファイルであり、このPowerShellのコード内の文字列の中に入れて、私はそれを解読しようとしたが䐲券で終わるなど

+0

Base64でエンコードされた文字列は常に、元のデータよりも長くなります。あなたはここに何か後方を持っているようです。 –

+0

@RogerLipscombe更新されました。 – JBurace

答えて

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== 

EDITを今、あなたは適切な質問を作ってみたことを、私はそれに答えることを試みることができます。私はあなたのテキストに間違ったエンコーダを使用していると思います。エンコードされた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

+0

更新された回答を参照してください。私はそれを再現することはできませんが、 "blahblah"からどのように "nVnV"(base64)が得られたかわかりません。 –

+0

私はOPを更新しました、ごめんなさい。はい、私は100%Powershellでそれをすることができますが、それは私がやっていることではありません。 Base64はテキストファイルから来ています。 – JBurace

3

Base64エンコーディングは、3つの8ビットバイト(0-255)を4つの6ビットバイト(0-63別名base64)に変換します。 4バイトのそれぞれは、最終出力を4つの8ビットASCII文字として表すASCII文字列をインデックスします。インデックス付き文字列は通常 'A-Za-z0-9 + /'で、 '='はパディングとして使用されます。このため、符号化されたデータは4/3長くなります。

逆方向処理です。予想通り、デコードされたデータの長さは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) 
関連する問題