この文字列をデコードするC#アプリケーションを作成しています。
"--W3sic3RhcnRfdGltZSI6IjAiLCJwcm9kdWN0X2lkIjoiODQwMDMzMDQiLCJ1cmwiOiIifSx7InN0YXJ0X3RpbWUiOiI3OSIsInByb2R1Y3RfaWQiOiI4NDAzNjk2MSIsInVybCI6IiJ9LHsic3RhcnRfdGltZSI6IjgyIiwicHJvZHVjdF9pZCI6Ijg0MDAzMDIwIiwidXJsIjoiIn0seyJzdGFydF90aW1lIjoiMTA5IiwicHJvZHVjdF9pZCI6IiIsInVybCI6Imh0dHBzOi8vYmxvZy5sYXJlaW5lZHVzaG9wcGluZy5jYS8yMDE3LzAxL3RyYW5zZm9ybWVyLXNlcy12aWV1eC1nYW50cy1kZS1jdWlyLWVuLTUtbWludXRlcy8ifV0 ="
このオンラインツールにコピーして貼り付けると機能します。 https://www.base64decode.org
しかし、Convert.FromBase64String(str)
を使用すると例外がスローされます。
System.FormatException:入力は、非ベース64文字、3つ以上のパディング文字、またはパディング文字の中の不正な文字を含むため、有効なBase-64文字列ではありません。
どうして?
URLデコードは、base64文字列から+
を削除して無効にします。それを指摘したことに対して私を下票する理由はありません。この質問を読んでいる他の人はそのコードを使用しますが、欠陥があります。 「a + ==」をデコードすると、結果は文字「k」になります。 URLデコードを使用して「a + ==」をデコードすると、URLデコードにより文字列が「a ==」に変換され、デコードしようとすると例外が発生します。
つまり、.Net Frameworkは無効な文字を許可しないBase64エンコードのバリアントを使用しており、問題のサイトで使用されているPHPは、無効な文字を許可するがそれらを破棄する別のバリアントを使用しています。
Base64エンコードは、3つのオクテットを4つのエンコードされた文字に変換します。 Base64エンコーディングの64文字のうち最初の62文字に有効な文字:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789
文字62と63に異なる文字を使用できるいくつかのバリアントがあります。C#では、最も一般的なバリアントと同様に、完全な文字セットは次のとおりです。
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
https://msdn.Microsoft.com/en-us/library/dhx0d524(v = vs.110).aspx
ゼロから昇順のベース64桁は、大文字の「A」から「Z」、小文字の「a」から「z」、数字の「0」から「9」、および記号「+」であり、 「/」。値のない文字「=」は、末尾のパディングに使用されます。
この変種は、RFC 3548またはRFC 4648の標準の 'base64'エンコーディングであり、特に指定がない限り、無効な値は禁止されています。
PHPは、MIME(RFC 2045)にBase64転送エンコードを使用します。これは無効な文字を許可しますが、それらを破棄します。
他のすべてのBase64バリアントでは、無効な文字は禁止されています。
元のBase64が実際に-
文字を含むことになっている場合、異なるバリアントを使用しています。
参照: https://en.wikipedia.org/wiki/Base64#Variants_summary_table
コードは有効なBase64文字列ではありません。文字列の先頭の-文字は無効です。この方法で変換できます。
using System;
using System.Text;
var decodedString = "--W3sic3RhcnRfdGltZSI6IjAiLCJwcm9kdWN0X2lkIjoiODQwMDMzMDQiLCJ1cmwiOiIifSx7InN0YXJ0X3RpbWUiOiI3OSIsInByb2R1Y3RfaWQiOiI4NDAzNjk2MSIsInVybCI6IiJ9LHsic3RhcnRfdGltZSI6IjgyIiwicHJvZHVjdF9pZCI6Ijg0MDAzMDIwIiwidXJsIjoiIn0seyJzdGFydF90aW1lIjoiMTA5IiwicHJvZHVjdF9pZCI6IiIsInVybCI6Imh0dHBzOi8vYmxvZy5sYXJlaW5lZHVzaG9wcGluZy5jYS8yMDE3LzAxL3RyYW5zZm9ybWVyLXNlcy12aWV1eC1nYW50cy1kZS1jdWlyLWVuLTUtbWludXRlcy8ifV0="
.Replace("-", "");
var bytes = Convert.FromBase64String(decodedString);
var encodedString = Encoding.UTF8.GetString(bytes);
Console.WriteLine(encodedString);
上記のように、文字列から_--
_プレフィックスを削除する必要があります。 Convert.FromBase64String(str)
を使用しているときにbase64文字列に_data:image/jpeg;base64,
_プレフィックスがあったときに同じエラーが発生したことを付け加えます。
文字列から_data:image/jpeg;base64,
_を削除すると機能しました。