base64 encoding

本文详细介绍了Base64编码与解码的过程,并通过示例代码展示了如何使用C++实现Base64的编码与解码功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//https://en.wikipedia.org/wiki/Base64

   std::string base64Encode(const std::vector<char>& byteData);

   std::vector<char> base64Decode(std::string & const inputString);


std::string Cbase64Dlg::base64Encode(const std::vector<char>& byteData)
{
   const std::string codes = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
   std::string base64String;
   int b;
   for (size_t i = 0; i < byteData.size(); i = i+3)
   {
      b = (byteData[i] & 0xFC) >> 2;
      base64String.push_back(codes[b]);
      b = (byteData[i] & 0x03) << 4;
      if (i + 1 < byteData.size())
      {
         b |= (byteData[i + 1] & 0xF0) >> 4;
         base64String.push_back(codes[b]);
         b = (byteData[i + 1] & 0x0F) << 2;
         if (i+2 < byteData.size())
         {
            b |= (byteData[i + 2] & 0xC0) >> 6;
            base64String.push_back(codes[b]);
            b = byteData[i + 2] & 0x3F;
            base64String.push_back(codes[b]);
         }
         else
         {
            base64String.push_back(codes[b]);
            base64String.append("=");
         }
      }
      else
      {
         base64String.push_back(codes[b]);
         base64String.append("==");
      }
   }
   
   return base64String;
}

std::vector<char> Cbase64Dlg::base64Decode(std::string & const inputString)
{   
   static std::string codes = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
   std::vector<char> decoded;

   if (inputString.length() % 4 != 0)    
   {
      return std::vector<char>();
   }

   //The ratio of output bytes to input bytes is 4:3
   int outLen = (inputString.length() * 3 / 4);

   size_t pos = inputString.find_first_of('=');
   if (pos != std::string::npos)
   {
      decoded.resize(outLen - (inputString.length() - pos));
   }
   else
   {
      decoded.resize(outLen);
   }

   int j = 0;
   int b[4] = {};

   const char* p = inputString.c_str();

   while(p && *p && j < outLen)
   {
      bool valid = false;
      for (int i=0; p && i < 4; ++i)
      {
         size_t pos = codes.find_first_of(*p++);
         if ( pos != std::string::npos)
         {
            b[i] = pos;
         }
      }

      if (j < outLen)
      {
         decoded[j++] = (byte) ((b[0] << 2) | (b[1] >> 4));;
         if (j < outLen && b[2] < 64)      
         {
            decoded[j++] = (byte) ((b[1] << 4) | (b[2] >> 2));

            if (j < outLen && b[3] < 64)  
            {
               decoded[j++] = (byte) ((b[2] << 6) | b[3]);
            }
         }
      }
   }

   return decoded;
}
void Cbase64Dlg::OnBnClickedButton1()
{
   char myints[] = "ABC&&&&&&&&&&";
   std::vector<char> byte (myints, myints + sizeof(myints) / sizeof(char) );
   std::string value = base64Encode(byte);
   std::cout << value << std::endl;
   std::vector<char>decode = base64Decode(value);
}

### FromBase64 解码过程中 Bad-Alloc 错误的发生阶段 Bad-alloc 错误通常是由于尝试分配超出可用内存限制的资源而触发的一种异常情况。在从 Base64 进行解码的操作中,这种类型的错误最有可能出现在初始化输出缓冲区的时候[^1]。这是因为,在开始实际的数据转换前,程序需要依据输入字符串长度来估算并请求一块适当尺寸的空间用于存放即将产生的原始字节流。当系统无法满足所提出的这块内存需求时就会抛出 bad-alloc 异常。 具体来说,如果输入非常庞大或者估计不准确导致过度高估所需空间量级,则可能会遇到这样的问题。此外,假如应用程序运行环境本身已经处于极度缺乏自由内存的状态下,即使是合理的请求也可能失败从而引发此类错误。 ### FromBase64Base64Encoding 的主要区别 FromBase64 是指将一段采用 Base64 编码方式表示的信息重新转化为其原本的形式(即未编码状态),这是一个反向过程;而 Base64Encoding 则正好相反,它是用来把任意二进制资料转变成基于 ASCII 文本格式以便于在网络上传输或者其他场景使用的正向操作[^1]。 两者之间还存在一些更细节上的差异: - **方向性**:正如前面提到过的那样,它们各自代表不同的数据流向 —— 一个是加密/封装的方向(Base64Encoding),另一个则是解密/恢复原来面貌(fromBase64)。 - **参数设置与选项支持**:在很多库实现里面,Base64Encoding 可能提供更多关于如何调整输出样式的选择权给开发者们,例如是否要加入换行符、使用何种变体(base64 或者 base64url)[^1]等。相比之下,fromBase64 主要是专注于正确无误地解析已有的编码串回到初始形态,并且有时也会提供像忽略非法字符还是立即终止之类的行为控制开关[^2]。 综上所述,虽然这两个概念紧密相连,但由于目的不同所以在应用层面表现出诸多特性上的差别。 ```python try: # Example of potential memory allocation during decoding process which could lead to bad_alloc exception. large_encoded_string = 'A' * (1024*1024*1024) # Simulating extremely long input string that may cause issues depending on system resources and implementation limits. original_data = base64.b64decode(large_encoded_string) except MemoryError as e: print(f"Memory error occurred: {e}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值