[C#]Probleem met base64 string

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • FoOnEeN
  • Registratie: Juli 2003
  • Laatst online: 13:08
Ik heb een probleem met een base64 encoded string. Wanneer ik deze wil converteren naar een leesbare string dan krijg ik de melding:
System.FormatException: Invalid character in a Base-64 string

Het lijkt er dus op dat er een ongeldig character in de string zit die hij niet kan converteren. Echter het gekke is dat ik deze melding alleen met grote bestanden krijg op onze acceptatie server en niet op mijn eigen testpc.

Situatie: Inlezen van emails met attachments in .csv formaat op een exchange server via IMAP. De bijlage wordt automatisch geconverteerd naar base64 encoding wanneer ik deze ophaal via IMAP.

Het ophalen van deze emails gaat zonder problemen op mijn testpc, zowel kleine (paar kb) als grote (1 Mb) bestanden.
Het probleem zit hem echter in het feit dat onze acceptatie server hier wel problemen mee heeft. Wanneer ik deze testmails stuur met daarin kleine attachments gaat het goed, deze worden correct ingelezen. Echter de grote bestanden (>400kb) geven een probleem en triggeren de bovenstaande error.

Ik ben er nog niet achter wat hier nu precies het probleem kan zijn, waarom zit er ineens een invalid character in als ik de mail uitlees op een andere machine?

De enige afwijking van deze 2 systemen waar ik vanaf weet is het feit dat de testpc nederlandse instellingen heeft en de server op engels staat.
Hier heb ik al eerder aanpassingen voor gemaakt, echter zou dat hier volgens mij geen invloed moeten hebben.

Code:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
//Get the attachment
byte[] decbuff = Convert.FromBase64String(attachmentBase64);  //Deze regel triggert de fout
string attachment = Encoding.UTF8.GetString(decbuff);

//Test stuk om de string op de acceptatie server te testen
foreach (char c in attachmentBase64)
{
    //Check if its a valid char
    if (!Regex.IsMatch(c.ToString(), "[A-z0-9+/=\\s]"))
    {
          ErrorLog.LogError("Invalid char: " + c, DateTime.Now); //Triggert nooit in test, alleen wel in acceptatie
    }
}


In het 2e stukje heb ik wat debug code toegevoegd die onze errorlogging misbruikt, aangezien ik hier niet uitgebreid op kan debuggen. Het rare is dat de foreach op de testpc geen enkele logging triggert en exact hetzelfde bestand voor elk character triggert bij de grote bestanden op de acceptatie server?

De logregel: Invalid char: <- Leeg character dus

Iemand een idee waarom dit kan optreden?


edit:
Dingen die ik al heb geprobeerd

- Carriage return eruit filteren, helpt niet
- Culture wisselen van nl-NL naar en-Us in testomgeving. Fout treed daar dan ook niet op.
- Spaties replacen naar +, zie Ander VB6 probleem

[ Voor 6% gewijzigd door FoOnEeN op 12-06-2009 16:12 ]


Acties:
  • 0 Henk 'm!

  • GENETX
  • Registratie: Juni 2005
  • Laatst online: 11:14
Code voor hardware aanzien? :N

* GENETX pakt de deegroller en jaagt de TS van de CSL naar de devschuur :+

[ Voor 8% gewijzigd door GENETX op 12-06-2009 14:36 ]


Acties:
  • 0 Henk 'm!

  • mOrPhie
  • Registratie: September 2000
  • Laatst online: 18-09 15:41

mOrPhie

❤️❤️❤️❤️🤍

Is het geen carriage return die er tussen zit per ongeluk? (en dus invalid is)

Een experimentele community-site: https://technobabblenerdtalk.nl/. DM voor invite code.


Acties:
  • 0 Henk 'm!

  • creator1988
  • Registratie: Januari 2007
  • Laatst online: 08:50
Welke chars geeft hij dan terug, bij het gooien van die foutmelding?

Acties:
  • 0 Henk 'm!

  • FoOnEeN
  • Registratie: Juli 2003
  • Laatst online: 13:08
Dat heb ik eerst ook geprobeerd, om te kijken welke chars er nu precies in de output te zien zijn. Echter kan ik dat niet zien want om de een of andere reden schrijft hij ze niet weg in de database. Waarschijnlijk is het een soort van \n or \r maar die in de C# string niet zo bekend staat. De characters zijn iig niet bekend in de ascii tabel want met een Convert.ToInt32(char) krijg ik alleen maar 0 terug.

Ik heb het nu opgelost door de gehele base64 string door de volgende loop heen te halen en de correcte characters aan een stringbuilder toe te voegen:

C#:
1
2
3
4
5
6
7
//Check base64 string
foreach (char c in attachmentBase64)
{
      //Check if its a valid char
      if (Regex.IsMatch(c.ToString(), "[A-z0-9+/=\\s]"))
            attachmentValidBase64.Append(c);
}


Enige wat me nog intrigeert is het feit dat ik dus niet precies weet wat de problematische chars zijn. Een replace op /r,/n,/t had geen effect.

Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

heb je niet de terminating '\0' character vast?

ASSUME makes an ASS out of U and ME


Acties:
  • 0 Henk 'm!

  • eek
  • Registratie: Februari 2001
  • Laatst online: 06-04-2020

eek

@MagickNET

Staat er niet een BOM aan het begin van je string als je gebruik maakt van Encoding.UTF8.GetString?

Skill is when luck becomes a habit.

Pagina: 1