Mercurial > hg > Members > kono > Cerium
diff Renderer/test_render/base64_de.cpp @ 283:55ea4465b1a2
fix test_render
author | e065746@localhost.localdomain |
---|---|
date | Fri, 05 Jun 2009 16:49:12 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Renderer/test_render/base64_de.cpp Fri Jun 05 16:49:12 2009 +0900 @@ -0,0 +1,91 @@ +#include <iostream> +#include <fstream> +using namespace std; + +class tagTT +{ +public: + unsigned char buf; + char *cont; + int nlen; +}; + + +unsigned char CtoNum(int c) +{ + if (c >= 'A' && c <= 'Z') return c-'A'; + if (c >= 'a' && c <= 'z') return (c - 'a')+26; + if (c >= '0' && c <= '9') return (c - '0')+52; + if (c == '+') return 62; + if (c == '/') return 63; + return 0; +} + + +int GetNumB64(tagTT &pWork) +{ + char wr; + unsigned char w; + unsigned char r; + + wr = *pWork.cont; + pWork.cont++; + if (wr=='\0' || wr=='=') + return -1; + + while(wr=='\n' || wr=='\t') + { + wr = *pWork.cont; + pWork.cont++; + } + + w = CtoNum(wr); + if (pWork.nlen == 0) + { + unsigned char w2; + + wr = *pWork.cont; + pWork.cont++; + if (wr!='\0' && wr!='=') + w2 = CtoNum(wr); + else + w2 = 0; + + pWork.buf = w << 2; + w = w2; + pWork.nlen = 6; + } + + pWork.nlen -= 2; + + r = pWork.buf | (w >> pWork.nlen); + + pWork.buf = (w << (8 - pWork.nlen)); + return r; +} + + +//int decode(char *cont, char *file_name) +int decode(char *cont, FILE *outfile) +{ + int rw; + tagTT work; + + //ofstream outfile(file_name); + + work.buf = 0; + work.nlen = 0; + work.cont = cont; + + rw = GetNumB64(work); + while ( rw != -1 ) + { + //outfile << (char)rw; + putc(rw, outfile); + rw = GetNumB64(work); + } + + //outfile.close(); + + return 0; +}