, , , B64. . - 1/3. . . . . :
#include "yourstuff.h"
static char Base64Map[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdef"
"ghijklmnopqrstuvwxyz0123456789+/";
static char Base64Decode[]=
{
62,
99, 99, 99,
63,
52, 53, 54, 55, 56, 57, 58, 59, 60, 61,
99, 99, 99, 99, 99, 99, 99,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
20, 21, 22, 23, 24, 25,
99, 99, 99, 99, 99, 99,
26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
36, 37, 38, 39, 40, 41, 42, 43, 44, 45,
46, 47, 48, 49, 50, 51
};
int TBase64Encode( const BYTE *input, int size, PSTR output)
{
int i, rc=0, block_size;
while (size>0)
{
if (size>=3)
block_size = 3;
else
block_size = size;
i = TBase64EncodeBlock( input, block_size, output);
if (i==-1)
return -1;
input += 3;
output += 4;
rc += 4;
size -= 3;
}
return rc;
}
int TBase64Decode( CPSTR input, int size, BYTE *output)
{
int output_size=0, i;
if (size<=0 || size & 3)
return -1;
while (size>0)
{
i = TBase64DecodeBlock( input, output);
if (i<0)
return i;
output_size += i;
output += i;
input += 4;
size -= 4;
}
return output_size;
}
int TBase64EncodeBlock( const BYTE *input, int size, PSTR output)
{
int i;
BYTE mask;
BYTE input_buffer[3];
if (!input || !output)
return -1;
if (size<1 || size>3)
return -1;
memset( input_buffer, 0, 3);
memcpy( input_buffer, input, size);
mask = input_buffer[2];
output[3] = mask & 0x3f;
output[2] = mask >> 6;
mask = input_buffer[1] << 2;
output[2] |= (mask & 0x3f);
output[1] = input_buffer[1] >> 4;
mask = input_buffer[0] << 4;
output[1] |= (mask & 0x3f);
output[0] = input_buffer[0]>>2;
for (i=0; i<4; i++)
output[i] = Base64Map[output[i]];
switch (size)
{
case 1:
output[2] = '=';
case 2:
output[3] = '=';
default:
break;
}
return 0;
}
int TBase64DecodeBlock( CPSTR input, BYTE *output)
{
int i, j;
int size=3;
BYTE mask;
BYTE input_buffer[4];
if (!input || !output)
return -1;
memcpy( input_buffer, input, 4);
if (input_buffer[3]=='=')
{
input_buffer[3] = 43;
size--;
}
if (input_buffer[2]=='=')
{
input_buffer[2] = 43;
size--;
}
for (i=0; i<4; i++)
{
j = (int) (input_buffer[i]-43);
if (j<0 || j>79)
return -2;
j = Base64Decode[j];
if (j==99)
return -3;
input_buffer[i] = (char) j;
}
mask = input_buffer[1] >> 4;
output[0] = (input_buffer[0]<<2) | mask;
if (size>1)
{
mask = input_buffer[1] << 4;
output[1] = input_buffer[2] >> 2;
output[1] |= mask;
if (size==3)
{
mask = input_buffer[2] << 6;
output[2] = input_buffer[3] | mask;
}
}
return size;
}