web-dev-qa-db-ja.com

Base64文字列をデコードする方法は?

Powershellには、Base64テキストを含むテキストファイルからの通常の文字列があります。 $xに保存されます。私はそれをそのようにデコードしようとしています:

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

これは、$xがPowershellで作成されたBase64文字列であった場合に機能します(ただし、そうではありません)。そして、これはファイルからの$x Base64文字列では機能しません。$z䐲券のようなものになります。

私は何が欠けていますか?たとえば、$xYmxhaGJsYWg=で、blahblahのBase64です。

一言で言えば、YmxhaGJsYWg=はテキストファイル内にあり、このPowershellコード内の文字列に入れられ、デコードしようとしますが、䐲券などになります。

46
JBurace

エンコードはテキストをbase64に、デコードはbase64をBACKに戻しませんか?ここでそれらを混ぜているようです。 このオンラインデコーダー を使用してデコードすると、次のようになります。

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
62
Frode F.

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

Base64デコードは逆のプロセスです。そして、予想されるように、デコードされたデータは3/4の長さです。

Base64エンコーディングはプレーンテキストをエンコードできますが、その本当の利点は、送信システムによって制御文字として解釈される可能性のある印刷できない文字をエンコードすることです。

オリジナルのポスターは、各ビットがアプリケーションにとって意味を持つバイトとして$ zをレンダリングすることをお勧めします。非印刷可能文字をテキストとしてレンダリングすると、通常、システムのローカライズに基づいてグリフを生成するUnicodeが呼び出されます。

Base64decode( "宇宙とすべての生命への答え")= 00101010

4
cknox

このページは、base64への変換方法をグーグルで検索すると表示されるため、完全を期すために:

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

Base64変換用のPowerShellネイティブコマンドはありません-まだ(PowerShellコア6.2.0以降)ですが、 専用コマンドレットの追加は推奨
今のところ、.NETの直接使用が必要です。

重要

  • Base64 encoding isan encoding ofbinarydatausingbytes値が明確に定義された64文字に制限されているsubrangeprintable charactersを表すASCII文字セットの任意のバイトを送信する際に問題が発生した時間、特に高ビットセット(バイト値> 0x7f)の場合。

  • したがって、常にexplicitlyを指定する必要がありますcharacter encodingBase64バイトは何を表す/すべきか

エルゴ:

  • base64への変換では、まず、Base64文字列のconsumerが期待する文字エンコードを使用して、エンコードしようとしている文字列のbyte表現を取得する必要があります。

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

Base64から変換:

PS> [Text.Encoding]::Utf8.GetString([Convert]::FromBase64String('TW90w7ZyaGVhZA=='))
Motörhead
3
mklement0

出力間にスペースが表示される問題があり、この問題を解決するためのオンラインでの回答がまったくありませんでした。文字通り、解決策を見つけるために何時間も費やし、コードをいじくり回してから、それが機能するようになった時点で入力した内容がほとんどわからないほどになっていたことを発見しました。この問題に対する私の修正は次のとおりです。[System.Text.Encoding]::UTF8.GetString(([System.Convert]::FromBase64String($base64string)|?{$_}))

1
中野春子