百度空间 | 百度首页 
 
查看文章
 
base64 decode/encode from nginx
2009-09-18 09:46

void
ngx_encode_base64(ngx_str_t *dst, ngx_str_t *src)
{
u_char         *d, *s;
size_t          len;
static u_char   basis64[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

len = src->len;
s = src->data;
d = dst->data;

while (len > 2) {
*d++ = basis64[(s[0] >> 2) & 0x3f];
*d++ = basis64[((s[0] & 3) << 4) | (s[1] >> 4)];
*d++ = basis64[((s[1] & 0x0f) << 2) | (s[2] >> 6)];
*d++ = basis64[s[2] & 0x3f];

s += 3;
len -= 3;
}

if (len) {
*d++ = basis64[(s[0] >> 2) & 0x3f];

if (len == 1) {
*d++ = basis64[(s[0] & 3) << 4];
*d++ = '=';

} else {
*d++ = basis64[((s[0] & 3) << 4) | (s[1] >> 4)];
*d++ = basis64[(s[1] & 0x0f) << 2];
}

*d++ = '=';
}

dst->len = d - dst->data;
}


ngx_int_t
ngx_decode_base64(ngx_str_t *dst, ngx_str_t *src)
{
size_t          len;
u_char         *d, *s;
static u_char   basis64[] = {
77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 62, 77, 77, 77, 63,
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 77, 77, 77, 77, 77, 77,
77,  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, 77, 77, 77, 77, 77,
77, 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, 77, 77, 77, 77, 77,

77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77
};

for (len = 0; len < src->len; len++) {
if (src->data[len] == '=') {
break;
}

if (basis64[src->data[len]] == 77) {
return NGX_ERROR;
}
}

if (len % 4 == 1) {
return NGX_ERROR;
}

s = src->data;
d = dst->data;

while (len > 3) {
*d++ = (u_char) (basis64[s[0]] << 2 | basis64[s[1]] >> 4);
*d++ = (u_char) (basis64[s[1]] << 4 | basis64[s[2]] >> 2);
*d++ = (u_char) (basis64[s[2]] << 6 | basis64[s[3]]);

s += 4;
len -= 4;
}

if (len > 1) {
*d++ = (u_char) (basis64[s[0]] << 2 | basis64[s[1]] >> 4);
}

if (len > 2) {
*d++ = (u_char) (basis64[s[1]] << 4 | basis64[s[2]] >> 2);
}

dst->len = d - dst->data;

return NGX_OK;
}


类别:c语言实践 | 添加到搜藏 | 浏览() | 评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu