Avatar billede rbjensen Nybegynder
16. marts 2004 - 22:42 Der er 12 kommentarer og
1 løsning

"Dekodning" af filename i POP3 besked

Jeg sidder og roder med at få et C++ (Borland C++ Builder, Win2K)program til hente email fra en POP3 server, og det giver nogle problemer.

Jeg forsøger blandt andet at hente en vedhæftet fil med det originale filnavn "Kære alle derhjemme.doc", men i den datastrøm (som gemmes i en tekstfil) jeg modtager er dette omdøbt til følgende:
filename="=?iso-8859-1?B?S+ZyZSBhbGxlIGRlcmhqZW1tZS5kb2M=?="

Hvordan "dekoder" man dette til noget mere normalt ?

Jeg anvender komponenten fra 'iPro' - http://sourceforge.net/projects/tpipro/

MVH rbjensen
Avatar billede bufferzone Praktikant
16. marts 2004 - 23:05 #1
normalt er mails og vedhæftede filer base 64 coded. hvordan dette håndteres i C har jeg ingen anelse om
Avatar billede arne_v Ekspert
16. marts 2004 - 23:38 #2
S+ZyZSBhbGxlIGRlcmhqZW1tZS5kb2M=

er ganske rigtigt bas64 encoding af

Kære alle derhjemme.doc

Så du skal have fat på noget base 64 decode kode.
Avatar billede arne_v Ekspert
16. marts 2004 - 23:40 #4
struct sixbits { unsigned sb1:6;
                unsigned sb2:6;
                unsigned sb3:6;
                unsigned sb4:6; };

union overlay { struct sixbits sixs;
                char eigths[3]; };

char enc_b64vals[64] = { 'A','B','C','D','E','F','G','H',
                        'I','J','K','L','M','N','O','P',
                        'Q','R','S','T','U','V','W','X',
                        'Y','Z','a','b','c','d','e','f',
                        'g','h','i','j','k','l','m','n',
                        'o','p','q','r','s','t','u','v',
                        'w','x','y','z','0','1','2','3',
                        '4','5','6','7','8','9','+','/' };

int enc_deb64(char c)
{
  switch (c) {
      case '0':
      case '1':
      case '2':
      case '3':
      case '4':
      case '5':
      case '6':
      case '7':
      case '8':
      case '9':
        return c-'0'+52;
      case 'A':
      case 'B':
      case 'C':
      case 'D':
      case 'E':
      case 'F':
      case 'G':
      case 'H':
      case 'I':
      case 'J':
      case 'K':
      case 'L':
      case 'M':
      case 'N':
      case 'O':
      case 'P':
      case 'Q':
      case 'R':
      case 'S':
      case 'T':
      case 'U':
      case 'V':
      case 'W':
      case 'X':
      case 'Y':
      case 'Z':
        return c-'A';
      case 'a':
      case 'b':
      case 'c':
      case 'd':
      case 'e':
      case 'f':
      case 'g':
      case 'h':
      case 'i':
      case 'j':
      case 'k':
      case 'l':
      case 'm':
      case 'n':
      case 'o':
      case 'p':
      case 'q':
      case 'r':
      case 's':
      case 't':
      case 'u':
      case 'v':
      case 'w':
      case 'x':
      case 'y':
      case 'z':
        return c-'a'+26;
      case '+':
        return 62;
      case '/':
        return 63;
      case '=':
        return 0;
      default:
        return -1;
  }
  return -1;
}

void NormalToB64(char *s1,int l1,char *s2,int *l2)
{
  union overlay Cvt;
  char *p = s1;
  int ltmp = (l1*8+5)/6;
  int extra = 3-(ltmp+3)%4;
  int linlen = 0;
  (*l2) = 0;
  // loop through string
  for(int i=0;i<ltmp;i=i+4) {
      // convert 8->6 bit
      Cvt.eigths[2]=(((p-s1)<l1)?(*p):0);
      p++;
      Cvt.eigths[1]=(((p-s1)<l1)?(*p):0);
      p++;
      Cvt.eigths[0]=(((p-s1)<l1)?(*p):0);
      p++;
      s2[*l2]=enc_b64vals[Cvt.sixs.sb4];
      (*l2)++;
      s2[*l2]=enc_b64vals[Cvt.sixs.sb3];
      (*l2)++;
      s2[*l2]=enc_b64vals[Cvt.sixs.sb2];
      (*l2)++;
      s2[*l2]=enc_b64vals[Cvt.sixs.sb1];
      (*l2)++;
      // append newline if line too long
      linlen=linlen+4;
      if(linlen>75) {
        s2[*l2]='\n';
        (*l2)++;
        linlen=0;
      }
  }
  // append 0,1 or 2 "="
  (*l2)=(*l2)-extra;
  for(int j=0;j<extra;j++) {
      s2[*l2]='=';
      (*l2)++;
  }
  // append newline
  s2[*l2]='\n';
  (*l2)++;
  return;
}

void B64ToNormal(char *s1,int l1,char *s2,int *l2)
{
  union overlay Cvt;
  char *p = s1;
  int skip = 0;
  (*l2) = 0;
  // loop through string
  while(p<(s1+l1)) {
      // convert 6->8 bit
      Cvt.sixs.sb4=enc_deb64(*p);
      p++;
      if((*p)=='=') skip++;
      Cvt.sixs.sb3=enc_deb64(*p);
      p++;
      if((*p)=='=') skip++;
      Cvt.sixs.sb2=enc_deb64(*p);
      p++;
      if((*p)=='=') skip++;
      Cvt.sixs.sb1=enc_deb64(*p);
      p++;
      s2[*l2]=Cvt.eigths[2];
      (*l2)++;
      s2[*l2]=Cvt.eigths[1];
      (*l2)++;
      s2[*l2]=Cvt.eigths[0];
      (*l2)++;
      (*l2)=(*l2)-skip;
      // skip newline
      if((*p)=='\n') p++;
  }
  return;
}
Avatar billede arne_v Ekspert
16. marts 2004 - 23:41 #5
Du kalder med B64ToNormal med:
  base 64 streng
  længde af base 64 streng
  buffer for læsbar streng
  pointer til længden af den læsbare streng
Avatar billede rbjensen Nybegynder
17. marts 2004 - 08:39 #6
Igen mange tak herfra, arne_v.
Avatar billede rbjensen Nybegynder
17. marts 2004 - 08:45 #7
...ok, jeg har ihærdigt forsøgt at trykke "Accepter" så arne_v kan få sine point, men der sker ikke en disse, siden reloader bare ?
Avatar billede rbjensen Nybegynder
17. marts 2004 - 09:07 #8
Ok, lige et enkelt spørgsmål mere:
En email har emnet:
Subject: =?ISO-8859-1?Q?Hej_lilles=F8ster?=
...er det encoded på en anden måde ?
Jeg kan i alt fald ikke få base 64 dekoderen til at konvertere den...
Avatar billede bufferzone Praktikant
17. marts 2004 - 09:22 #9
Tryk på arnes navn, så det er markeret og tryk accepter, så skulle den være der
Avatar billede arne_v Ekspert
17. marts 2004 - 09:29 #10
Nej - det er quoted printable og ikke base 64.
Avatar billede rbjensen Nybegynder
17. marts 2004 - 09:30 #11
Ah - også tak til dig, bufferzone.
Avatar billede arne_v Ekspert
17. marts 2004 - 09:33 #12
Groft sagt skal =nn erstattes med det tegn som har den hexadecimale værdi nn.

Jeg har også C kode til det.

Men jeg kan først poste det på fredag.
Avatar billede rbjensen Nybegynder
18. marts 2004 - 22:29 #13
Opfølgning:
Jeg fandt noget kode på http://www.codeproject.com/string/ammimeutils.asp som automatisk kan detektere kodetypen for subjects/sender felter og decode disse.
Mange tak for hjælpen, arne_v, du behøver så ikke finde QuotedPrintable-kode til mig.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester