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