17 votes

Convert.FromBase64String ne fonctionne pas dans le code mais fonctionne dans l'outil en ligne

J'écris une application C# pour décoder cette chaîne :

"-- W3sic3RhcnRfdGltZSI6IjAiLCJwcm9kdWN0X2lkIjoiODQwMDMzMDQiLCJ1cmwiOiIifSx7InN0YXJ0X3RpbWUiOiI3OSIsInByb2R1Y3RfaWQiOiI4NDAzNjk2MSIsInVybCI6IiJ9LHsic3RhcnRfdGltZSI6IjgyIiwicHJvZHVjdF9pZCI6Ijg0MDAzMDIwIiwidXJsIjoiIn0seyJzdGFydF90aW1lIjoiMTA5IiwicHJvZHVjdF9pZCI6IiIsInVybCI6Imh0dHBzOi8vYmxvZy5sYXJlaW5lZHVzaG9wcGluZy5jYS8yMDE3LzAxL3RyYW5zZm9ybWVyLXNlcy12aWV1eC1nYW50cy1kZS1jdWlyLWVuLTUtbWludXRlcy8ifV0="

Il fonctionne lorsque je le copie/colle dans cet outil en ligne : https://www.base64decode.org

Mais une exception est levée lorsque j'utilise Convert.FromBase64String(str) :

System.FormatException : L'entrée n'est pas une chaîne Base-64 valide car elle contient un caractère non-base 64, plus de deux caractères de remplissage, ou un caractère illégal parmi les caractères de remplissage.

Pourquoi ?

21voto

Alexander Higgins Points 66

Le décodage de l'URL supprimera + d'une chaîne base64, ce qui la rend invalide. Il n'y a aucune raison de m'infliger un vote négatif pour l'avoir signalé. D'autres personnes lisant cette question utiliseront ce code et il est défectueux. Si vous décodez 'a+==', le résultat sera le caractère 'k'. Si vous utilisez le décodage d'URL pour décoder "a+==", le décodage d'URL transformera la chaîne en "a ==" et vous obtiendrez une exception en essayant de la décoder.

En résumé, le .Net Framework utilise une variante de l'encodage Base64 qui n'autorise pas les caractères non valides et PHP, utilisé par le site en question, utilise une autre variante qui autorise les caractères non valides mais les rejette.

Le codage Base64 convertit trois octets en quatre caractères codés. Caractères valides pour les 62 premiers des 64 caractères de l'encodage Base64 :

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789

Il existe plusieurs variantes qui autorisent des caractères différents pour les caractères 62 et 63. Avec C#, comme avec les variantes les plus courantes, le jeu de caractères complet est :

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=

https://msdn.microsoft.com/en-us/library/dhx0d524(v=vs.110).aspx

Les chiffres en base 64, dans l'ordre croissant à partir de zéro, sont les suivants les caractères majuscules "A" à "Z", les caractères minuscules "a" à "z", les les chiffres "0" à "9" et les symboles "+" et "/". Le caractère sans valeur sans valeur, "=", est utilisé pour le remplissage de la queue.

Cette variante est connue sous le nom d'encodage standard "base64" pour la RFC 3548 ou la RFC 4648, dans lequel les valeurs invalides sont interdites, sauf indication contraire.

PHP utilise l'encodage de transfert Base64 pour MIME (RFC 2045) qui autorise les caractères non valides mais les rejette.

Dans toutes les autres variantes de Base64, les caractères non valides sont interdits.

Si la base64 d'origine était effectivement censée contenir l'élément - il utilise une variante différente.

Voir : https://en.wikipedia.org/wiki/Base64#Variants_summary_table

6voto

Saeid Points 751

Votre code n'est pas une chaîne Base64 valide. Les caractères - au début de la chaîne ne sont pas valides. Vous pouvez le convertir de cette manière.

using System;
using System.Text;

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

1voto

jakobinn Points 361

Vous devrez retirer le -- de votre chaîne de caractères, comme indiqué ci-dessus. Je voudrais ajouter que j'ai obtenu la même erreur lorsque j'avais data:image/jpeg;base64, dans ma chaîne base64 lorsque j'utilise Convert.FromBase64String(str) .

Suppression data:image/jpeg;base64, de la chaîne travaillée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X