您的位置:首页 > 其它

base64编码与解码

2013-09-16 17:10 288 查看
2.解码

参考1:

// 从 data 还原 base64编码,解码的结果保存到 buffer

static void

decode_base64(uint8_t *buffer, uint16_t len, uint8_t *data)

{

    uint8_t *bp = buffer; // bp 指向最近解出的码可以存放的位置

    uint8_t *p = data; // p 指向 一组编码(四个) 的开头

    uint8_t c1, c2, c3, c4; // 每次从 data 里获得 4 个编码存到c1 ~ c4

    while (bp < buffer + len) { // 可保存解码的位置还没有超出缓冲区

        c1 = CHAR64(*p); // 假设读取了 00aaaaaa 到 c1 (a表示 1 或 0)

        c2 = CHAR64(*(p + 1)); // 假设读取了 00aabbbb 到 c2 (b表示 1 或 0)

        if (c1 == 255 || c2 == 255)

            break; // 如果遇到编码结束符 == 255 就退出解码过程

        // 八位的c1左移两位,头六位成为解码的头部

        // 用(00110000)截取八位的c2前半字节的后两位,右移四位,成为解码的尾部

        *bp++ = (c1 << 2) | ((c2 & 0x30) >> 4); // (aaaaaa00) | (000000aa)

        if (bp >= buffer + len)

            break; // 如果超出缓冲区,就退出本次解码过程

        c3 = CHAR64(*(p + 2)); // 假设读取了 00bbbbcc 到 c3 (b 或 c 表示 1 或 0)

        if (c3 == 255)

            break; // 如果遇到编码结束符 == 255 就退出解码过程

        // 用(00001111)截取八位的c2后半字节,左移四位,成为解码的头部

        // 用(00111100)截取八位的c3中间四位,右移两位,成为解码的尾部

        *bp++ = ((c2 & 0x0f) << 4) | ((c3 & 0x3c) >> 2); // (bbbb0000) | (0000bbbb)

        if (bp >= buffer + len)

            break; // 如果超出缓冲区,就退出本次解码过程

        c4 = CHAR64(*(p + 3)); // 假设读取了 00cccccc 到 c4 (c 表示 1 或 0)

        if (c4 == 255)

            break; // 如果遇到编码结束符 == 255 就退出解码过程

        // 用(00000011)截取八位的c3中最后两位,左移六位,成为解码的头部

        // c4中最后六位,成为解码的尾部

        *bp++ = ((c3 & 0x03) << 6) | c4; // (cc000000) | (00cccccc)

        p += 4; // p 移动到 下一组(四个) 编码的开头

    }

}

----------------------

参考2:

char *b64index = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

bool Base64Decode(char *code, char *txt)

{

 int len  = strlen(code);

 if(len % 4) return false;

 char *buf = new char[len];

 int i,j;

 bool p =  false;

 for(i = 0; i < len; i++)

 {

  p = false;

  for(j = 0; j < 64; j++)

  {

   if(code[i] == b64index[j] || code[i] == '=')

   {

    buf[i] = j;

    p = true;

    break;

   }

  }

 

  if(!p)

   return false;  //出现非法字符

 }

 if(code[len - 1] == '=') buf[len - 1] = 0;

 if(code[len - 2] == '=') buf[len - 2] = 0;

 for(i = 0; i < len / 4; i++)

 {

  txt[i * 3]   = buf[i * 4] << 2 & 0xFC | ( buf[i * 4 + 1] >> 4 & 0x03);

  txt[i * 3 + 1]  = buf[i * 4 + 1] << 4 & 0xF0 | ( buf[i * 4 + 2] >> 2 & 0x0F);

  txt[i * 3 + 2]  = buf[i * 4 + 2] << 6 & 0xC0 | buf[i * 4 + 3];

 }

 

 txt[len * 6 / 8] = '\0';

 delete buf;

 return true;

}

 

--------------------------------

参考3:

 引用自:http://my.csdn.net/cclongying1989/code/detail/13009

 

ascii码表:http://baike.baidu.com/view/15482.htm?fromId=812    
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: