cansat_B 2019 / Mbed 2 deprecated camera-pic-xbee

Dependencies:   mbed JPEGCamera

Committer:
saeichi
Date:
Mon Nov 25 08:19:58 2019 +0000
Revision:
0:581241ed8da9
camera-pic-xbee;

Who changed what in which revision?

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