SOUI官方论坛

 找回密码
 立即注册
查看: 1109|回复: 2

分享个base64 类

[复制链接]
  • TA的每日心情
    开心
    2024-3-4 16:42
  • 签到天数: 41 天

    [LV.5]常住居民I

    23

    主题

    76

    帖子

    240

    积分

    02:00元婴期

    Rank: 3Rank: 3

    积分
    240
    发表于 2019-11-25 12:48:53 | 显示全部楼层 |阅读模式
    1. #pragma once

    2. #include <string>



    3. class CCBase64

    4. {

    5. public:

    6.         CCBase64(void);

    7.         virtual ~CCBase64(void);



    8. public:

    9.         std::string base64encode(std::string src, int srclen);

    10.         std::string base64decode(std::string inpt, int * len);



    11. protected:

    12.         unsigned char * base64;

    13. };

    14. #include "StdAfx.h"
    15. #include "CBase64.h"

    16. CCBase64::CCBase64(void)
    17. {
    18.         base64 = (unsigned char *)"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    19. }

    20. CCBase64::~CCBase64(void)
    21. {
    22. }

    23. std::string CCBase64::base64encode(std::string src, int srclen)
    24. {
    25.         int n, buflen, i, j;
    26.         static unsigned char *dst;
    27.         std::string buf = src;
    28.         buflen = n = srclen;
    29.         dst = (unsigned char*)malloc(buflen / 3 * 4 + 3);
    30.         memset(dst, 0, buflen / 3 * 4 + 3);
    31.         for (i = 0, j = 0; i <= buflen - 3; i += 3, j += 4) {
    32.                 dst[j] = (buf[i] & 0xFC) >> 2;
    33.                 dst[j + 1] = ((buf[i] & 0x03) << 4) + ((buf[i + 1] & 0xF0) >> 4);
    34.                 dst[j + 2] = ((buf[i + 1] & 0x0F) << 2) + ((buf[i + 2] & 0xC0) >> 6);
    35.                 dst[j + 3] = buf[i + 2] & 0x3F;
    36.         }
    37.         if (n % 3 == 1) {
    38.                 dst[j] = (buf[i] & 0xFC) >> 2;
    39.                 dst[j + 1] = ((buf[i] & 0x03) << 4);
    40.                 dst[j + 2] = 64;
    41.                 dst[j + 3] = 64;
    42.                 j += 4;
    43.         }
    44.         else if (n % 3 == 2) {
    45.                 dst[j] = (buf[i] & 0xFC) >> 2;
    46.                 dst[j + 1] = ((buf[i] & 0x03) << 4) + ((buf[i + 1] & 0xF0) >> 4);
    47.                 dst[j + 2] = ((buf[i + 1] & 0x0F) << 2);
    48.                 dst[j + 3] = 64;
    49.                 j += 4;
    50.         }
    51.         for (i = 0; i < j; i++) /* map 6 bit value to base64 ASCII character */
    52.                 dst[i] = base64[(int)dst[i]];
    53.         dst[j] = 0;
    54.         std::string dststr((char*)dst);
    55.         return dststr;
    56. }

    57. std::string CCBase64::base64decode(std::string inpt, int * len)
    58. {
    59.         int n, i, j, pad;
    60.         unsigned char *p;
    61.         static unsigned char *dst;
    62.         unsigned char * src;
    63.         *len = 0;
    64.         pad = 0;
    65.         n = inpt.length();
    66.         src = new unsigned char[n];
    67.         for (i = 0; i < n; i++)
    68.                 src[i] = inpt[i];

    69.         while (n > 0 && src[n - 1] == '=') {
    70.                 src[n - 1] = 0;
    71.                 pad++;
    72.                 n--;
    73.         }
    74.         for (i = 0; i < n; i++) { /* map base64 ASCII character to 6 bit value */
    75.                 p = (unsigned char *)strchr((const char *)base64, (int)src[i]);
    76.                 if (!p)
    77.                         break;
    78.                 src[i] = p - (unsigned char *)base64;
    79.         }

    80.         dst = (unsigned char *)malloc(n * 3 / 4 + 1);
    81.         memset(dst, 0, n * 3 / 4 + 1);
    82.         for (i = 0, j = 0; i < n; i += 4, j += 3) {
    83.                 dst[j] = (src[i] << 2) + ((src[i + 1] & 0x30) >> 4);
    84.                 dst[j + 1] = ((src[i + 1] & 0x0F) << 4) + ((src[i + 2] & 0x3C) >> 2);
    85.                 dst[j + 2] = ((src[i + 2] & 0x03) << 6) + src[i + 3];
    86.                 *len += 3;
    87.         }
    88.         *len -= pad;
    89.         std::string destr((char*)dst);
    90.         return destr;
    91. }
    复制代码
    如果有不对的请帮改正哈

  • TA的每日心情
    开心
    7 天前
  • 签到天数: 942 天

    [LV.10]以坛为家III

    580

    主题

    1340

    帖子

    2万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    28797
    发表于 2019-11-25 14:39:11 | 显示全部楼层
    谢谢楼主分享
  • TA的每日心情

    2023-12-11 09:55
  • 签到天数: 47 天

    [LV.5]常住居民I

    5

    主题

    44

    帖子

    308

    积分

    02:00元婴期

    Rank: 3Rank: 3

    积分
    308
    发表于 2021-6-29 14:24:46 | 显示全部楼层

    谢谢楼主分享
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|SOUI官方论坛

    GMT+8, 2024-5-5 16:52

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表