123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- #include "stdafx.h"
- #include "MyBase64.h"
- namespace MyBase64{
- void Encode(const string plain,string& encoded)
- {
- unsigned int bytes = plain.size();
- unsigned int outSz = (bytes + 3 - 1) / 3 * 4;
- outSz += (outSz + pemLineSz - 1) / pemLineSz; // new lines
- unsigned int index = 0;
-
- while (bytes > 2) {
- unsigned char b1 = plain[index++];
- unsigned char b2 = plain[index++];
- unsigned char b3 = plain[index++];
- // encoded idx
- unsigned char e1 = b1 >> 2;
- unsigned char e2 = ((b1 & 0x3) << 4) | (b2 >> 4);
- unsigned char e3 = ((b2 & 0xF) << 2) | (b3 >> 6);
- unsigned char e4 = b3 & 0x3F;
- // store
- encoded.append(1,base64Encode[e1]);
- encoded.append(1,base64Encode[e2]);
- encoded.append(1,base64Encode[e3]);
- encoded.append(1,base64Encode[e4]);
- bytes -= 3;
- //enter anther row
- /* if ((++j % 16) == 0 && bytes)
- encoded.append(1,'\n');*/
- }
- // last integral
- if (bytes) {
- bool twoBytes = (bytes == 2);
- unsigned char b1 = plain[index++];
- unsigned char b2 = (twoBytes) ? plain[index++]: 0;
- unsigned char e1 = b1 >> 2;
- unsigned char e2 = ((b1 & 0x3) << 4) | (b2 >> 4);
- unsigned char e3 = (b2 & 0xF) << 2;
- encoded.append(1,base64Encode[e1]);
- encoded.append(1,base64Encode[e2]);
- encoded.append(1,(twoBytes) ? base64Encode[e3] : pad);
- encoded.append(1,pad);
- }
- encoded.append(1,'\0');
- }
- void Decode(const string coded,string& decoded)
- {
- unsigned int bytes = coded.size();
- unsigned int plainSz = bytes - ((bytes + (pemLineSz - 1)) / pemLineSz);
- plainSz = (plainSz * 3 + 3) / 4;
- //decoded_.New(plainSz);
- unsigned int i = 0;
- unsigned int j = 0;
- unsigned int index = 0;
- while (bytes > 3) {
- unsigned char e1 = coded[index++];
- unsigned char e2 = coded[index++];
- unsigned char e3 = coded[index++];
- unsigned char e4 = coded[index++];
- // do asserts first
- if (e1 == 0) // end file 0's
- break;
- bool pad3 = false;
- bool pad4 = false;
- if (e3 == pad)
- pad3 = true;
- if (e4 == pad)
- pad4 = true;
- e1 = base64Decode[e1 - 0x2B];
- e2 = base64Decode[e2 - 0x2B];
- e3 = (e3 == pad) ? 0 : base64Decode[e3 - 0x2B];
- e4 = (e4 == pad) ? 0 : base64Decode[e4 - 0x2B];
- unsigned char b1 = (e1 << 2) | (e2 >> 4);
- unsigned char b2 = ((e2 & 0xF) << 4) | (e3 >> 2);
- unsigned char b3 = ((e3 & 0x3) << 6) | e4;
- decoded.append(1,b1);
- if (!pad3)
- decoded.append(1,b2);
- if (!pad4)
- decoded.append(1,b3);
- else
- break;
-
- bytes -= 4;
- //if ((++j % 16) == 0) {
- // unsigned char endLine = coded[index++];//coded_.next();
- // bytes--;
- // while (endLine == ' ') { // remove possible whitespace
- // endLine = coded[index++];
- // bytes--;
- // }
- // if (endLine == '\r') {
- // endLine = coded[index++];
- // bytes--;
- // }
- // if (endLine != '\n') {
- // return;
- // }
- //}
- }
- }
- }
|