Class導入前です まだできてません
Dependencies: mbed CameraUS015sb612-3
base64.cpp@4:1354e56c7dd3, 2019-11-20 (annotated)
- Committer:
- YUPPY
- Date:
- Wed Nov 20 08:06:46 2019 +0000
- Revision:
- 4:1354e56c7dd3
class_before_loading;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
YUPPY | 4:1354e56c7dd3 | 1 | #include "base64.h" |
YUPPY | 4:1354e56c7dd3 | 2 | |
YUPPY | 4:1354e56c7dd3 | 3 | const char *base64::szB64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; |
YUPPY | 4:1354e56c7dd3 | 4 | |
YUPPY | 4:1354e56c7dd3 | 5 | base64::base64() : lpszOutputString(NULL) |
YUPPY | 4:1354e56c7dd3 | 6 | { |
YUPPY | 4:1354e56c7dd3 | 7 | } |
YUPPY | 4:1354e56c7dd3 | 8 | |
YUPPY | 4:1354e56c7dd3 | 9 | base64::~base64() |
YUPPY | 4:1354e56c7dd3 | 10 | { |
YUPPY | 4:1354e56c7dd3 | 11 | if(lpszOutputString) |
YUPPY | 4:1354e56c7dd3 | 12 | delete[] lpszOutputString; |
YUPPY | 4:1354e56c7dd3 | 13 | } |
YUPPY | 4:1354e56c7dd3 | 14 | |
YUPPY | 4:1354e56c7dd3 | 15 | const char *base64::Encode(const char *szStr, int iLens) |
YUPPY | 4:1354e56c7dd3 | 16 | { |
YUPPY | 4:1354e56c7dd3 | 17 | int i,j; |
YUPPY | 4:1354e56c7dd3 | 18 | |
YUPPY | 4:1354e56c7dd3 | 19 | if(lpszOutputString) |
YUPPY | 4:1354e56c7dd3 | 20 | delete[] lpszOutputString; |
YUPPY | 4:1354e56c7dd3 | 21 | |
YUPPY | 4:1354e56c7dd3 | 22 | if(iLens == -1) |
YUPPY | 4:1354e56c7dd3 | 23 | iLen = strlen(szStr); |
YUPPY | 4:1354e56c7dd3 | 24 | else |
YUPPY | 4:1354e56c7dd3 | 25 | iLen = iLens; |
YUPPY | 4:1354e56c7dd3 | 26 | |
YUPPY | 4:1354e56c7dd3 | 27 | lpszOutputString = |
YUPPY | 4:1354e56c7dd3 | 28 | new char[(int)((double)(iLen)*1.5)+10]; |
YUPPY | 4:1354e56c7dd3 | 29 | for(i = 0,j = 0; i < (iLen - (iLen % 3)); i+=3) |
YUPPY | 4:1354e56c7dd3 | 30 | { |
YUPPY | 4:1354e56c7dd3 | 31 | lpszOutputString[j] = szB64[(szStr[i] & 0xfc) >> 2]; |
YUPPY | 4:1354e56c7dd3 | 32 | lpszOutputString[j+1] = szB64[((szStr[i] &0x03) << 4) | |
YUPPY | 4:1354e56c7dd3 | 33 | ((szStr[i+1] & 0xf0) >> 4)]; |
YUPPY | 4:1354e56c7dd3 | 34 | lpszOutputString[j+2] = szB64[((szStr[i+1] & 0x0f) <<2 ) | |
YUPPY | 4:1354e56c7dd3 | 35 | ((szStr[i+2] & 0xc0) >> 6)]; |
YUPPY | 4:1354e56c7dd3 | 36 | lpszOutputString[j+3] = szB64[(szStr[i+2] & 0x3f)]; |
YUPPY | 4:1354e56c7dd3 | 37 | j += 4; |
YUPPY | 4:1354e56c7dd3 | 38 | } |
YUPPY | 4:1354e56c7dd3 | 39 | i = iLen-(iLen % 3); // 残りのサイズを計算 |
YUPPY | 4:1354e56c7dd3 | 40 | switch(iLen % 3) |
YUPPY | 4:1354e56c7dd3 | 41 | { |
YUPPY | 4:1354e56c7dd3 | 42 | case 2: // 1文字分パディングが必要 |
YUPPY | 4:1354e56c7dd3 | 43 | { |
YUPPY | 4:1354e56c7dd3 | 44 | lpszOutputString[j] = szB64[(szStr[i] & 0xfc) >> 2]; |
YUPPY | 4:1354e56c7dd3 | 45 | lpszOutputString[j+1] = szB64[((szStr[i] &0x03) << 4) | |
YUPPY | 4:1354e56c7dd3 | 46 | ((szStr[i+1] & 0xf0) >> 4)]; |
YUPPY | 4:1354e56c7dd3 | 47 | lpszOutputString[j+2] = szB64[((szStr[i+1] & 0x0f) <<2 )]; |
YUPPY | 4:1354e56c7dd3 | 48 | lpszOutputString[j+3] = szB64[64]; // Pad |
YUPPY | 4:1354e56c7dd3 | 49 | lpszOutputString[j+4] = '\0'; |
YUPPY | 4:1354e56c7dd3 | 50 | } |
YUPPY | 4:1354e56c7dd3 | 51 | break; |
YUPPY | 4:1354e56c7dd3 | 52 | case 1: // 2文字分パディングが必要 |
YUPPY | 4:1354e56c7dd3 | 53 | { |
YUPPY | 4:1354e56c7dd3 | 54 | lpszOutputString[j] = szB64[(szStr[i] & 0xfc) >> 2]; |
YUPPY | 4:1354e56c7dd3 | 55 | lpszOutputString[j+1] = szB64[((szStr[i] &0x03) << 4)]; |
YUPPY | 4:1354e56c7dd3 | 56 | lpszOutputString[j+2] = szB64[64]; // Pad |
YUPPY | 4:1354e56c7dd3 | 57 | lpszOutputString[j+3] = szB64[64]; // Pad |
YUPPY | 4:1354e56c7dd3 | 58 | lpszOutputString[j+4] = '\0'; |
YUPPY | 4:1354e56c7dd3 | 59 | } |
YUPPY | 4:1354e56c7dd3 | 60 | break; |
YUPPY | 4:1354e56c7dd3 | 61 | } |
YUPPY | 4:1354e56c7dd3 | 62 | lpszOutputString[j+4] = '\0'; |
YUPPY | 4:1354e56c7dd3 | 63 | |
YUPPY | 4:1354e56c7dd3 | 64 | return lpszOutputString; |
YUPPY | 4:1354e56c7dd3 | 65 | } |
YUPPY | 4:1354e56c7dd3 | 66 | |
YUPPY | 4:1354e56c7dd3 | 67 | void base64::Encode(istream& istr, ostream& ostr, int iRet) |
YUPPY | 4:1354e56c7dd3 | 68 | { |
YUPPY | 4:1354e56c7dd3 | 69 | int i; |
YUPPY | 4:1354e56c7dd3 | 70 | char c[3]; |
YUPPY | 4:1354e56c7dd3 | 71 | |
YUPPY | 4:1354e56c7dd3 | 72 | i = 0; |
YUPPY | 4:1354e56c7dd3 | 73 | while(!istr.eof()) |
YUPPY | 4:1354e56c7dd3 | 74 | { |
YUPPY | 4:1354e56c7dd3 | 75 | c[0] = c[1] = c[2] = '\0'; |
YUPPY | 4:1354e56c7dd3 | 76 | istr.read(c,3); |
YUPPY | 4:1354e56c7dd3 | 77 | |
YUPPY | 4:1354e56c7dd3 | 78 | ostr << szB64[(c[0] & 0xfc) >> 2]; |
YUPPY | 4:1354e56c7dd3 | 79 | i++; if(i >= iRet && iRet != -1){ ostr << endl; i = 0; } |
YUPPY | 4:1354e56c7dd3 | 80 | ostr << szB64[((c[0] &0x03) << 4) | ((c[1] & 0xf0) >> 4)]; |
YUPPY | 4:1354e56c7dd3 | 81 | i++; if(i >= iRet && iRet != -1){ ostr << endl; i = 0; } |
YUPPY | 4:1354e56c7dd3 | 82 | if(istr.gcount() == 1) |
YUPPY | 4:1354e56c7dd3 | 83 | ostr << szB64[64]; |
YUPPY | 4:1354e56c7dd3 | 84 | else |
YUPPY | 4:1354e56c7dd3 | 85 | ostr << szB64[((c[1] & 0x0f) <<2 ) | ((c[2] & 0xc0) >> 6)]; |
YUPPY | 4:1354e56c7dd3 | 86 | i++; if(i >= iRet && iRet != -1){ ostr << endl; i = 0; } |
YUPPY | 4:1354e56c7dd3 | 87 | if(istr.gcount() == 3) |
YUPPY | 4:1354e56c7dd3 | 88 | ostr << szB64[(c[2] & 0x3f)]; |
YUPPY | 4:1354e56c7dd3 | 89 | else |
YUPPY | 4:1354e56c7dd3 | 90 | ostr << szB64[64]; |
YUPPY | 4:1354e56c7dd3 | 91 | i++; if(i >= iRet && iRet != -1){ ostr << endl; i = 0; } |
YUPPY | 4:1354e56c7dd3 | 92 | } |
YUPPY | 4:1354e56c7dd3 | 93 | ostr.flush(); |
YUPPY | 4:1354e56c7dd3 | 94 | } |
YUPPY | 4:1354e56c7dd3 | 95 | |
YUPPY | 4:1354e56c7dd3 | 96 | |
YUPPY | 4:1354e56c7dd3 | 97 | int base64::FindIndexInB64(char c) |
YUPPY | 4:1354e56c7dd3 | 98 | { |
YUPPY | 4:1354e56c7dd3 | 99 | int index = 0; |
YUPPY | 4:1354e56c7dd3 | 100 | while(szB64[index] != '\0' && szB64[index] != c) |
YUPPY | 4:1354e56c7dd3 | 101 | index++; |
YUPPY | 4:1354e56c7dd3 | 102 | |
YUPPY | 4:1354e56c7dd3 | 103 | if(szB64[index] == '\0') |
YUPPY | 4:1354e56c7dd3 | 104 | return -1; // 見つからず |
YUPPY | 4:1354e56c7dd3 | 105 | |
YUPPY | 4:1354e56c7dd3 | 106 | return index; // 見つかった。 |
YUPPY | 4:1354e56c7dd3 | 107 | } |
YUPPY | 4:1354e56c7dd3 | 108 | |
YUPPY | 4:1354e56c7dd3 | 109 | const char *base64::Decode(const char *szStr) |
YUPPY | 4:1354e56c7dd3 | 110 | { |
YUPPY | 4:1354e56c7dd3 | 111 | //lpszOutputString |
YUPPY | 4:1354e56c7dd3 | 112 | int i, j, l,iWriteCount,len; |
YUPPY | 4:1354e56c7dd3 | 113 | char c; |
YUPPY | 4:1354e56c7dd3 | 114 | char buf[4]; |
YUPPY | 4:1354e56c7dd3 | 115 | |
YUPPY | 4:1354e56c7dd3 | 116 | len = iLen = strlen(szStr); |
YUPPY | 4:1354e56c7dd3 | 117 | if(lpszOutputString) |
YUPPY | 4:1354e56c7dd3 | 118 | delete[] lpszOutputString; |
YUPPY | 4:1354e56c7dd3 | 119 | |
YUPPY | 4:1354e56c7dd3 | 120 | iLen = (int)(((double)(iLen)/4.0)*3.0) + 4; |
YUPPY | 4:1354e56c7dd3 | 121 | |
YUPPY | 4:1354e56c7dd3 | 122 | lpszOutputString = new char[iLen]; |
YUPPY | 4:1354e56c7dd3 | 123 | |
YUPPY | 4:1354e56c7dd3 | 124 | for(i = 0, j = 0; i < len; i+=4) |
YUPPY | 4:1354e56c7dd3 | 125 | { |
YUPPY | 4:1354e56c7dd3 | 126 | iWriteCount = 3; |
YUPPY | 4:1354e56c7dd3 | 127 | for(l = 0; l < 4 && i+l<len; l++) |
YUPPY | 4:1354e56c7dd3 | 128 | { |
YUPPY | 4:1354e56c7dd3 | 129 | c = szStr[i+l]; |
YUPPY | 4:1354e56c7dd3 | 130 | if(c == szB64[64]) // Pad |
YUPPY | 4:1354e56c7dd3 | 131 | iWriteCount--; |
YUPPY | 4:1354e56c7dd3 | 132 | else { |
YUPPY | 4:1354e56c7dd3 | 133 | buf[l] = FindIndexInB64(c); |
YUPPY | 4:1354e56c7dd3 | 134 | //if(buf[l] == -1) error!; |
YUPPY | 4:1354e56c7dd3 | 135 | } |
YUPPY | 4:1354e56c7dd3 | 136 | } |
YUPPY | 4:1354e56c7dd3 | 137 | lpszOutputString[j] = ((buf[0] << 2) & 0xfc) | ((buf[1] >> 4) & 0x03); |
YUPPY | 4:1354e56c7dd3 | 138 | if(iWriteCount >= 2) |
YUPPY | 4:1354e56c7dd3 | 139 | lpszOutputString[j+1] = ((buf[1] << 4) & 0xf0) | ((buf[2] >> 2) & 0x0f); |
YUPPY | 4:1354e56c7dd3 | 140 | if(iWriteCount == 3) |
YUPPY | 4:1354e56c7dd3 | 141 | lpszOutputString[j+2] = ((buf[2] << 6) & 0xc0) | (buf[3] & 0x3f); |
YUPPY | 4:1354e56c7dd3 | 142 | j+=iWriteCount; |
YUPPY | 4:1354e56c7dd3 | 143 | } |
YUPPY | 4:1354e56c7dd3 | 144 | iLen = j; |
YUPPY | 4:1354e56c7dd3 | 145 | lpszOutputString[j] = '\0'; |
YUPPY | 4:1354e56c7dd3 | 146 | |
YUPPY | 4:1354e56c7dd3 | 147 | return lpszOutputString; |
YUPPY | 4:1354e56c7dd3 | 148 | } |
YUPPY | 4:1354e56c7dd3 | 149 | |
YUPPY | 4:1354e56c7dd3 | 150 | void base64::Decode(istream& istr, ostream& ostr) |
YUPPY | 4:1354e56c7dd3 | 151 | { |
YUPPY | 4:1354e56c7dd3 | 152 | int i,iWriteCount; |
YUPPY | 4:1354e56c7dd3 | 153 | char c; |
YUPPY | 4:1354e56c7dd3 | 154 | char buf[4]; |
YUPPY | 4:1354e56c7dd3 | 155 | char out[3]; |
YUPPY | 4:1354e56c7dd3 | 156 | |
YUPPY | 4:1354e56c7dd3 | 157 | while(1) |
YUPPY | 4:1354e56c7dd3 | 158 | { |
YUPPY | 4:1354e56c7dd3 | 159 | iWriteCount = 3; |
YUPPY | 4:1354e56c7dd3 | 160 | for(i = 0; i < 4; i++) |
YUPPY | 4:1354e56c7dd3 | 161 | { |
YUPPY | 4:1354e56c7dd3 | 162 | istr >> c; |
YUPPY | 4:1354e56c7dd3 | 163 | if(istr.eof()) |
YUPPY | 4:1354e56c7dd3 | 164 | { |
YUPPY | 4:1354e56c7dd3 | 165 | ostr.flush(); |
YUPPY | 4:1354e56c7dd3 | 166 | return; |
YUPPY | 4:1354e56c7dd3 | 167 | } |
YUPPY | 4:1354e56c7dd3 | 168 | if(c == szB64[64]) // Pad |
YUPPY | 4:1354e56c7dd3 | 169 | iWriteCount--; |
YUPPY | 4:1354e56c7dd3 | 170 | else { |
YUPPY | 4:1354e56c7dd3 | 171 | buf[i] = FindIndexInB64(c); |
YUPPY | 4:1354e56c7dd3 | 172 | //if(buf[i] == -1) error!; |
YUPPY | 4:1354e56c7dd3 | 173 | } |
YUPPY | 4:1354e56c7dd3 | 174 | } |
YUPPY | 4:1354e56c7dd3 | 175 | out[0] = ((buf[0] << 2) & 0xfc) | ((buf[1] >> 4) & 0x03); |
YUPPY | 4:1354e56c7dd3 | 176 | out[1] = ((buf[1] << 4) & 0xf0) | ((buf[2] >> 2) & 0x0f); |
YUPPY | 4:1354e56c7dd3 | 177 | out[2] = ((buf[2] << 6) & 0xc0) | (buf[3] & 0x3f); |
YUPPY | 4:1354e56c7dd3 | 178 | ostr.write(out, iWriteCount); |
YUPPY | 4:1354e56c7dd3 | 179 | } |
YUPPY | 4:1354e56c7dd3 | 180 | } |