Class導入前です まだできてません

Dependencies:   mbed CameraUS015sb612-3

Committer:
YUPPY
Date:
Wed Nov 20 08:06:46 2019 +0000
Revision:
4:1354e56c7dd3
class_before_loading;

Who changed what in which revision?

UserRevisionLine numberNew 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 }