En forme courte, vous pouvez:
- diviser la chaîne sur tous les caractères qui ne sont pas des données de base64 valides ou padding
- essayer de convertir chaque jeton
- si la conversion réussit, appelez remplacer le chaîne d'origine pour passer le jeton avec la valeur convertie
Dans le code:
var delimiters = new char[] { /* non-base64 ASCII chars */ };
var possibles = value.Split(delimiters, StringSplitOptions.RemoveEmptyEntries);
//need to tweak to include padding chars in matches, but still split on padding?
//maybe better off creating a regex to match base64 + padding
//and using Regex.Split?
foreach(var match in possibles)
{
try
{
var converted = Convert.FromBase64String(match);
var text = System.Text.Encoding.UTF8.GetString(converted);
if(!string.IsNullOrEmpty(text))
{
value = value.Replace(match, text);
}
}
catch (System.ArgumentNullException)
{
//handle it
}
catch (System.FormatException)
{
//handle it
}
}
Cependant, sans délimiteur, vous pouvez finir par convertir du texte non-base64 qui est également valide en tant que texte codé en base64.
En regardant votre exemple d'essayer de convertir "Hello QXdlc29tZQ== World"
-"Hello Awesome World"
l'algorithme ci-dessus pourrait facilement générer quelque chose comme "ée¡Ý•Í½µ”¢¹]"
en essayant de convertir toute la chaîne de base64 puisqu'il n'y a pas delimiter entre le texte brut et codé.
Mise à jour (en fonction des commentaires):
S'il n'y a pas '\n'
s dans la teneur en base64 et il est toujours précédé d'"Content-Transfer-Encoding: base64\n"
, alors il y a un moyen:
- diviser la chaîne sur
'\n'
- sur tous les itérer jetons jusqu'à ce qu'un jeton se termine dans
"Content-Transfer-Encoding: base64"
- le prochain jeton (s'il y en a) doit être décodé (si possible) et le remplacement devrait être ma de la chaîne d'origine
- de retour à jusqu'à épuisement des itération jetons
Dans le code:
private string ConvertMixedUpTextAndBase64(string value)
{
var delimiters = new char[] { '\n' };
var possibles = value.Split(delimiters,
StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < possibles.Length - 1; i++)
{
if (possibles[i].EndsWith("Content-Transfer-Encoding: base64"))
{
var nextTokenPlain = DecodeBase64(possibles[i + 1]);
if (!string.IsNullOrEmpty(nextTokenPlain))
{
value = value.Replace(possibles[i + 1], nextTokenPlain);
i++;
}
}
}
return value;
}
private string DecodeBase64(string text)
{
string result = null;
try
{
var converted = Convert.FromBase64String(text);
result = System.Text.Encoding.UTF8.GetString(converted);
}
catch (System.ArgumentNullException)
{
//handle it
}
catch (System.FormatException)
{
//handle it
}
return result;
}
est la teneur en base64 délimité de quelque manière que ? – jball
Ceci est un problème XY. Le vrai problème est X: comment vous êtes-vous retrouvé avec une chaîne comme ça? –
@Hans Passant Je suis d'accord, j'essaie d'écrire un outil pour corriger certaines données qui étaient corrompues en quelque sorte. Nous avons déjà réparé la partie rendant les données corrompues, mais maintenant nous devons le réparer sur environ 3 millions d'enregistrements. – Adam