90
|
1 #include <stdio.h>
|
|
2 //#include <iostream>
|
|
3 #include <fstream>
|
|
4 using namespace std;
|
|
5
|
|
6 class tagTT
|
|
7 {
|
|
8 public:
|
|
9 unsigned char buf;
|
|
10 char *cont;
|
|
11 int nlen;
|
|
12 };
|
|
13
|
|
14
|
|
15 unsigned char CtoNum(int c)
|
|
16 {
|
|
17 if (c >= 'A' && c <= 'Z') return c-'A';
|
|
18 if (c >= 'a' && c <= 'z') return (c - 'a')+26;
|
|
19 if (c >= '0' && c <= '9') return (c - '0')+52;
|
|
20 if (c == '+') return 62;
|
|
21 if (c == '/') return 63;
|
|
22 return 0;
|
|
23 }
|
|
24
|
|
25
|
|
26 int GetNumB64(tagTT &pWork)
|
|
27 {
|
|
28 char wr;
|
|
29 unsigned char w;
|
|
30 unsigned char r;
|
|
31
|
|
32 wr = *pWork.cont;
|
|
33 pWork.cont++;
|
|
34 if (wr=='\0' || wr=='=')
|
|
35 return -1;
|
|
36
|
|
37 while(wr=='\n' || wr=='\t')
|
|
38 {
|
|
39 wr = *pWork.cont;
|
|
40 pWork.cont++;
|
|
41 }
|
|
42
|
|
43 w = CtoNum(wr);
|
|
44 if (pWork.nlen == 0)
|
|
45 {
|
|
46 unsigned char w2;
|
|
47
|
|
48 wr = *pWork.cont;
|
|
49 pWork.cont++;
|
|
50 if (wr!='\0' && wr!='=')
|
|
51 w2 = CtoNum(wr);
|
|
52 else
|
|
53 w2 = 0;
|
|
54
|
|
55 pWork.buf = w << 2;
|
|
56 w = w2;
|
|
57 pWork.nlen = 6;
|
|
58 }
|
|
59
|
|
60 pWork.nlen -= 2;
|
|
61
|
|
62 r = pWork.buf | (w >> pWork.nlen);
|
|
63
|
|
64 pWork.buf = (w << (8 - pWork.nlen));
|
|
65 return r;
|
|
66 }
|
|
67
|
|
68
|
|
69 //int decode(char *cont, char *file_name)
|
|
70 int decode(char *cont, FILE *outfile)
|
|
71 {
|
|
72 int rw;
|
|
73 tagTT work;
|
|
74
|
|
75 //ofstream outfile(file_name);
|
|
76
|
|
77 work.buf = 0;
|
|
78 work.nlen = 0;
|
|
79 work.cont = cont;
|
|
80
|
|
81 rw = GetNumB64(work);
|
|
82 while ( rw != -1 )
|
|
83 {
|
|
84 //outfile << (char)rw;
|
|
85 putc(rw, outfile);
|
|
86 rw = GetNumB64(work);
|
|
87 }
|
|
88
|
|
89 //outfile.close();
|
|
90
|
|
91 return 0;
|
|
92 }
|