荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: 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软件 网络书店