荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: xxxss.bbs@bbs.chenguang.org (1/2), 信区: Linux
标 题: [code] QP / BASE64 转码副程式
发信站: 交大晨光 (Tue Oct 22 12:36:28 2002)
转信站: SZU!news.tiaozhan.com!news.happynet.org!chenguang
发信人: opus.bbs@bbs.cs.nthu.edu.tw (独立苍茫), 看板: Plan
标 题: [code] QP / BASE64 转码副程式
发信站: 清华资讯(枫桥驿站) (Thu Dec 5 04:40:01 1996)
转信站: sobee!news.cs.nthu!maple
看板上的文章标题采用 Quoted-Printable / BASE64 编码的
越来越多了,底下是简单的转码程式:
■ str_decode(dst, src) 判断字串 src 采用哪种编码方式,
转换成 bit-8 的格式後,存进 dst。如果 src 未经编码,
dst 中的资料就是原来的样子。
■ 可以将这段副程式放在 innbbsd / mailpost / bbsmail
做前端处理。
有些文章的标题含 ansi control code,不妨也加以滤除。
■ QP / BASE64 的编码方式可参见 RFC1521。
--------------------------------------------------------------------------------
/* ----------------------------------------------------- */
/* QP code : "0123456789ABCDEF" */
/* ----------------------------------------------------- */
static int
qp_code(x)
register int x;
{
if (x >= '0' && x <= '9')
return x - '0';
if (x >= 'a' && x <= 'f')
return x - 'a' + 10;
if (x >= 'A' && x <= 'F')
return x - 'A' + 10;
return -1;
}
/* ------------------------------------------------------------------ */
/* BASE64 : */
/* "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" */
/* ------------------------------------------------------------------ */
static int
base64_code(x)
register int x;
{
if (x >= 'A' && x <= 'Z')
return x - 'A';
if (x >= 'a' && x <= 'z')
return x - 'a' + 26;
if (x >= '0' && x <= '9')
return x - '0' + 52;
if (x == '+')
return 62;
if (x == '/')
return 63;
return -1;
}
/* ----------------------------------------------------- */
/* judge & decode QP / BASE64 */
/* ----------------------------------------------------- */
void
str_decode(dst, src)
register unsigned char *dst, *src;
{
register int is_qp, is_base64, is_done;
register int c1, c2, c3, c4;
for (is_done = is_qp = is_base64 = 0; c1 = *src; src++)
{
if (c1 == '?' && src[1] == '=')
{
src++;
continue;
}
else if (c1 == '\n') /* chuan: multi line encoding */
{
src++;
is_done = is_qp = is_base64 = 0;
continue;
}
else if (is_qp && c1 == '=')
{
c1 = *++src;
c2 = *++src;
*dst++ = (qp_code(c1) << 4) | qp_code(c2);
}
else if (is_base64 && !is_done)
{
while (isspace(c1))
{
c1 = *++src;
}
if (!c1)
break;
do
{
c2 = *++src;
} while (isspace(c2));
if (!c2)
break;
do
{
c3 = *++src;
} while (isspace(c3));
if (!c3)
break;
do
{
c4 = *++src;
} while (isspace(c4));
if (!c4)
break;
if (c1 == '=' || c2 == '=')
{
is_done = 1;
continue;
}
c2 = base64_code(c2);
*dst++ = (base64_code(c1) << 2) | ((c2 & 0x30) >> 4);
if (c3 == '=')
is_done = 1;
else
{
c3 = base64_code(c3);
*dst++ = ((c2 & 0xF) << 4) | ((c3 & 0x3c) >> 2);
if (c4 == '=')
is_done = 1;
else
{
*dst++ = ((c3 & 0x03) << 6) | base64_code(c4);
}
}
}
else if ((c1 == '=') && (src[1] == '?'))
{
/* c2 : qmarks, c3 : code_kind */
c2 = c3 = 0;
for (;;)
{
c1 = *++src;
if (c1 != '?')
{
if (c2 == 2)
c3 = c1 | 0x20;
}
else
{
if (++c2 >= 3)
break;
}
}
if (c3 == 'q')
is_qp = 1;
else if (c3 == 'b')
is_base64 = 1;
}
else
*dst++ = c1;
}
*dst = '\0';
}
--
※ 来源:·交大晨光 bbs.chenguang.org·[FROM: 172.16.15.10]
[回到开始]
[上一篇][下一篇]
荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店