static char base64_table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
int base64_encode(const void *src, size_t src_len, char *dst)
{
const unsigned char *s = (const unsigned char*)src;
size_t i = 0;
size_t len = 0;
for (; i < src_len; len += 4)
{
unsigned c;
c = s[i++];
c <<= 8;
if (i < src_len)
c += s[i];
c <<= 8;
i++;
if (i < src_len)
c += s[i];
i++;
*dst++ = base64_table[(c >> 18) & 0x3f];
*dst++ = base64_table[(c >> 12) & 0x3f];
if (i > (src_len + 1))
*dst++ = '=';
else
*dst++ = base64_table[(c >> 6) & 0x3f];
if (i > src_len)
*dst++ = '=';
else
*dst++ = base64_table[(c >> 0) & 0x3f];
}
*dst = '\0';
return 0;
}
int pos(unsigned char c)
{
return (strchr(base64_table, c) - base64_table);
}
void SKIP_SPACE(const char *src, int i, int size)
{
while (i < size && isspace(*src))
{
i++;
src++;
}
if (i == size)
{
i = size + 1;
}
}
int base64_decode(const char *src, size_t size, void *dst)
{
char b[3];
size_t i = 0;
char *dst_base = (char *)dst;
char *d = dst_base;
size_t j;
while (i < size)
{
unsigned c = 0;
size_t mark = 0;
SKIP_SPACE(src, i, size);
c += pos(*src++);
c <<= 6;
i++;
SKIP_SPACE(src, i, size);
c += pos(*src++);
c <<= 6;
i++;
SKIP_SPACE(src, i, size);
if (*src != '=')
c += pos(*src++);
else
{
i = size;
mark = 2;
c <<= 6;
goto end;
}
c <<= 6;
i++;
SKIP_SPACE(src, i, size);
if (*src != '=')
c += pos(*src++);
else
{
i = size;
mark = 1;
goto end;
}
i++;
end:
b[0] = (c >> 16) & 0xff;
b[1] = (c >> 8) & 0xff;
b[2] = (c >> 0) & 0xff;
for (j = 0; j < 3 - mark; j++)
*d++ = b[j];
}
if (i != size)
{
return -1;
}
return (int)(d - dst_base);
}
标签:编码,base64,src,++,解码,Base64,char,dst,size
From: https://blog.51cto.com/fengyuzaitu/9002767