0
点赞
收藏
分享

微信扫一扫

Base64 编码/解码应用

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);
}

举报

相关推荐

0 条评论