web-dev-qa-db-ja.com

Convert.FromBase64Stringはコードでは機能しませんが、オンラインツールでは機能します

この文字列をデコードするC#アプリケーションを作成しています。

"--W3sic3RhcnRfdGltZSI6IjAiLCJwcm9kdWN0X2lkIjoiODQwMDMzMDQiLCJ1cmwiOiIifSx7InN0YXJ0X3RpbWUiOiI3OSIsInByb2R1Y3RfaWQiOiI4NDAzNjk2MSIsInVybCI6IiJ9LHsic3RhcnRfdGltZSI6IjgyIiwicHJvZHVjdF9pZCI6Ijg0MDAzMDIwIiwidXJsIjoiIn0seyJzdGFydF90aW1lIjoiMTA5IiwicHJvZHVjdF9pZCI6IiIsInVybCI6Imh0dHBzOi8vYmxvZy5sYXJlaW5lZHVzaG9wcGluZy5jYS8yMDE3LzAxL3RyYW5zZm9ybWVyLXNlcy12aWV1eC1nYW50cy1kZS1jdWlyLWVuLTUtbWludXRlcy8ifV0 ="

このオンラインツールにコピーして貼り付けると機能します。 https://www.base64decode.org

しかし、Convert.FromBase64String(str)を使用すると例外がスローされます。

System.FormatException:入力は、非ベース64文字、3つ以上のパディング文字、またはパディング文字の中の不正な文字を含むため、有効なBase-64文字列ではありません。

どうして?

9
Darius

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

13

コードは有効なBase64文字列ではありません。文字列の先頭の-文字は無効です。この方法で変換できます。

using System;
using System.Text;

var decodedString = "--W3sic3RhcnRfdGltZSI6IjAiLCJwcm9kdWN0X2lkIjoiODQwMDMzMDQiLCJ1cmwiOiIifSx7InN0YXJ0X3RpbWUiOiI3OSIsInByb2R1Y3RfaWQiOiI4NDAzNjk2MSIsInVybCI6IiJ9LHsic3RhcnRfdGltZSI6IjgyIiwicHJvZHVjdF9pZCI6Ijg0MDAzMDIwIiwidXJsIjoiIn0seyJzdGFydF90aW1lIjoiMTA5IiwicHJvZHVjdF9pZCI6IiIsInVybCI6Imh0dHBzOi8vYmxvZy5sYXJlaW5lZHVzaG9wcGluZy5jYS8yMDE3LzAxL3RyYW5zZm9ybWVyLXNlcy12aWV1eC1nYW50cy1kZS1jdWlyLWVuLTUtbWludXRlcy8ifV0="
    .Replace("-", "");
var bytes = Convert.FromBase64String(decodedString);
var encodedString = Encoding.UTF8.GetString(bytes);
Console.WriteLine(encodedString);
6
Saeid

上記のように、文字列から_--_プレフィックスを削除する必要があります。 Convert.FromBase64String(str)を使用しているときにbase64文字列に_data:image/jpeg;base64,_プレフィックスがあったときに同じエラーが発生したことを付け加えます。

文字列から_data:image/jpeg;base64,_を削除すると機能しました。

0
jakobinn