C++实现BASE64码编解码

用C/C++实现Base64编码和解码 2022.12.19日,看了一下base64原理,然后想用代码实现一下,改了好久的bug终于完美成功了。 阅读详情


原文:http://blog.youkuaiyun.com/chenxiaohua/archive/2009/04/16/4084602.aspx

概述:base64可以将不可显示的编码转换成可显示的编码,以便于存储。
比如http一般传输的是文本格式的报文,如果要传输图片,那么就要先将图片编码成base64的报文传输,然后在客客户端显示的时候,将base64的报文解密,转换成二进制的图片数据显示。
下面给出源代码,可以直接在linux,msvc环境下进行编译。 

 

  1. #ifndef ___BASE64_H___  
  2. #define ___BASE64_H___  
  3.   
  4.   
  5. #include <string>  
  6.   
  7. using namespace std;  
  8.   
  9. class CBase64  
  10. {  
  11. public:  
  12.     CBase64();  
  13.     ~CBase64();  
  14.   
  15.     /********************************************************* 
  16.     * 函数说明:将输入数据进行base64编码 
  17.     * 参数说明:[in]pIn      需要进行编码的数据 
  18.                 [in]uInLen  输入参数的字节数 
  19.                 [out]strOut 输出的进行base64编码之后的字符串 
  20.     * 返回值  :true处理成功,false失败 
  21.     * 作  者  :ChenLi 
  22.     * 编写时间:2009-02-17 
  23.     **********************************************************/  
  24.     bool static Encode(const unsigned char *pIn, unsigned long uInLen, string& strOut);  
  25.   
  26.     /********************************************************* 
  27.     * 函数说明:将输入数据进行base64编码 
  28.     * 参数说明:[in]pIn          需要进行编码的数据 
  29.                 [in]uInLen      输入参数的字节数 
  30.                 [out]pOut       输出的进行base64编码之后的字符串 
  31.                 [out]uOutLen    输出的进行base64编码之后的字符串长度 
  32.     * 返回值  :true处理成功,false失败 
  33.     * 作  者  :ChenLi 
  34.     * 编写时间:2009-02-17 
  35.     **********************************************************/  
  36.     bool static Encode(const unsigned char *pIn, unsigned long uInLen, unsigned char *pOut, unsigned long *uOutLen);  
  37.       
  38.     /********************************************************* 
  39.     * 函数说明:将输入数据进行base64解码 
  40.     * 参数说明:[in]strIn        需要进行解码的数据 
  41.                 [out]pOut       输出解码之后的节数数据 
  42.                 [out]uOutLen    输出的解码之后的字节数长度 
  43.     * 返回值  :true处理成功,false失败 
  44.     * 作  者  :ChenLi 
  45.     * 编写时间:2009-02-17 
  46.     **********************************************************/  
  47.     bool static Decode(const string& strIn, unsigned char *pOut, unsigned long *uOutLen) ;  
  48.   
  49.     /********************************************************* 
  50.     * 函数说明:将输入数据进行base64解码 
  51.     * 参数说明:[in]strIn        需要进行解码的数据 
  52.                 [out]pOut       输出解码之后的节数数据 
  53.                 [out]uOutLen    输出的解码之后的字节数长度 
  54.     * 返回值  :true处理成功,false失败 
  55.     * 作  者  :ChenLi 
  56.     * 编写时间:2009-02-17 
  57.     **********************************************************/  
  58.     bool static Decode(const unsigned char *pIn, unsigned long uInLen, unsigned char *pOut, unsigned long *uOutLen) ;  
  59. };  
  60.   
  61. #endif // ___BASE64_H___  

 

 
#include "CBase64.h"

static const char *g_pCodes =
 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

static const unsigned char g_pMap[256] =
{
 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
 255, 255, 255, 255, 255, 255, 255,  62, 255, 255, 255,  63,
  52,  53,  54,  55,  56,  57,  58,  59,  60,  61, 255, 255,
 255, 254, 255, 255, 255,   0,   1,   2,   3,   4,   5,   6,
   7,   8,   9,  10,  11,  12,  13,  14,  15,  16,  17,  18,
  19,  20,  21,  22,  23,  24,  25, 255, 255, 255, 255, 255,
 255,  26,  27,  28,  29,  30,  31,  32,  33,  34,  35,  36,
  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,  48,
  49,  50,  51, 255, 255, 255, 255, 255, 255, 255, 255, 255,
 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
 255, 255, 255, 255
};

CBase64::CBase64()
{
}

CBase64::~CBase64()
{
}

bool CBase64::Encode(const unsigned char *pIn, unsigned long uInLen, unsigned char *pOut, unsigned long *uOutLen)
{
 unsigned long i, len2, leven;
 unsigned char *p;

 if(pOut == NULL || *uOutLen == 0)
  return false;

 //ASSERT((pIn != NULL) && (uInLen != 0) && (pOut != NULL) && (uOutLen != NULL));

 len2 = ((uInLen + 2) / 3) << 2;
 if((*uOutLen) < (len2 + 1)) return false;

 p = pOut;
 leven = 3 * (uInLen / 3);
 for(i = 0; i < leven; i += 3)
 {
  *p++ = g_pCodes[pIn[0] >> 2];
  *p++ = g_pCodes[((pIn[0] & 3) << 4) + (pIn[1] >> 4)];
  *p++ = g_pCodes[((pIn[1] & 0xf) << 2) + (pIn[2] >> 6)];
  *p++ = g_pCodes[pIn[2] & 0x3f];
  pIn += 3;
 }

 if (i < uInLen)
 {
  unsigned char a = pIn[0];
  unsigned char b = ((i + 1) < uInLen) ? pIn[1] : 0;
  unsigned char c = 0;

  *p++ = g_pCodes[a >> 2];
  *p++ = g_pCodes[((a & 3) << 4) + (b >> 4)];
  *p++ = ((i + 1) < uInLen) ? g_pCodes[((b & 0xf) << 2) + (c >> 6)] : '=';
  *p++ = '=';
 }

 *p = 0; // Append NULL byte
 *uOutLen = p - pOut;
 return true;
}

bool CBase64::Encode(const unsigned char *pIn, unsigned long uInLen, string& strOut)
{
 unsigned long i, len2, leven;
 strOut = "";

 //ASSERT((pIn != NULL) && (uInLen != 0) && (pOut != NULL) && (uOutLen != NULL));

 len2 = ((uInLen + 2) / 3) << 2;
 //if((*uOutLen) < (len2 + 1)) return false;

 //p = pOut;
 leven = 3 * (uInLen / 3);
 for(i = 0; i < leven; i += 3)
 {
  strOut += g_pCodes[pIn[0] >> 2];
  strOut += g_pCodes[((pIn[0] & 3) << 4) + (pIn[1] >> 4)];
  strOut += g_pCodes[((pIn[1] & 0xf) << 2) + (pIn[2] >> 6)];
  strOut += g_pCodes[pIn[2] & 0x3f];
  pIn += 3;
 }

 if (i < uInLen)
 {
  unsigned char a = pIn[0];
  unsigned char b = ((i + 1) < uInLen) ? pIn[1] : 0;
  unsigned char c = 0;

  strOut += g_pCodes[a >> 2];
  strOut += g_pCodes[((a & 3) << 4) + (b >> 4)];
  strOut += ((i + 1) < uInLen) ? g_pCodes[((b & 0xf) << 2) + (c >> 6)] : '=';
  strOut += '=';
 }

 //*p = 0; // Append NULL byte
 //*uOutLen = p - pOut;
 return true;
}

bool CBase64::Decode(const string& strIn, unsigned char *pOut, unsigned long *uOutLen)
{
 unsigned long t, x, y, z;
 unsigned char c;
 unsigned long g = 3;

 //ASSERT((pIn != NULL) && (uInLen != 0) && (pOut != NULL) && (uOutLen != NULL));

 for(x = y = z = t = 0; x < strIn.length(); x++)
 {
  c = g_pMap[strIn[x]];
  if(c == 255) continue;
  if(c == 254) { c = 0; g--; }

  t = (t << 6) | c;

  if(++y == 4)
  {
   if((z + g) > *uOutLen) { return false; } // Buffer overflow
   pOut[z++] = (unsigned char)((t>>16)&255);
   if(g > 1) pOut[z++] = (unsigned char)((t>>8)&255);
   if(g > 2) pOut[z++] = (unsigned char)(t&255);
   y = t = 0;
  }
 }

 *uOutLen = z;
 return true;
}

// BASE64.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "CBase64.h"

#include <iostream>

using namespace std;

int main(int argc, char* argv[])
{
 unsigned long len = 10;

 unsigned char pIn[100];
 unsigned char pOut[100];

 memcpy(pIn,"你好",5);

 string strout;

 cout<<(char*)pIn<<endl;
 if(CBase64::Encode(pIn, 4, strout))
  cout<<strout<<endl;
 else
  cout<<"加密失败"<<endl;

 string stroIn = strout;
 cout<<stroIn<<endl;

 memset(pOut,0,sizeof(pOut));

 if(CBase64::Decode(stroIn, pOut, &len))
 {
  cout<<(char *)pOut<<endl;
  cout<<"len="<<strlen((char *)pOut)<<endl;
 }
 else
  cout<<"解密失败"<<endl;

 cout<<len<<endl;

 return 0;
}


C++实现的Base64编码与解码 最近工作需要将二进制保存到hive里,但是很不幸,hive不支持bit字节流的存储,尤其是不定长的字节流。怎么办呢?我们的解决方案是将二进制转成可见的字符再存储字符串。于是使用Base64进行编码。在Java中使用Base64是十分方便的,因为java8自带base64的工具包。但是我们的字节流dump过程是在c++里实现的,而c++的stl中是不会有这个东西的。怎么办?还好我们有boost,但是boost是一个比较庞大复杂的东西,对于我们这个简单的功能实在是大材小用。我不太想引入这个。于是自己造轮子吧。 阅读详情

相关推荐

Base64编解码及C++代码实现

Base64是一种二进制到文本的编码方式。如果要更具体一点的话,可以认为它是一种将byte数组编码为字符串的方法,而且编码出的字符串只包含ASCII基础字符。例如字符串 mickey0380 对应的Base64为 bWlja2V5MDM4MA==。其中那个 = 比较特殊,是填充符。值得注意的是Base64不是加密算法,其仅仅是一种编码方式,算法也是公开的,所以不能依赖它进行加密。

mickey2007的博客 6317

C/C++学习笔记 dlib中的base64编码源码分析

头文件climits定义了符号常量来表示类型的限制,编译器厂商提供了climits文件,该文件支持了其编译器中的值。1、这里首先了解streambuf::sgetn,是用于从streambuf对象的缓冲区中获取字符序列,获取 get 指针后面的。CRLF:\r\n 表示回车并换行,Windows操作系统采用两个字符来进行换行,即CRLF。,还需要加上一个回车换行,所以看到counter = 19,这里的76个字符是指写入到输出流的。这里组织了编码、解码的字符数组,下面是关于初始值的说明。

学以致用 知行合一 880

C++ Base64编码解码实战:cpp-base64库核心原理与高性能应用指南

Base64编码是一种将二进制数据转换为ASCII字符的编码方案,广泛应用于网络传输、数据存储和配置文件等场景。其核心原理是将每3个字节(24位)数据分割为4个6位单元,并映射到64个特定字符表。这种编码技术的主要价值在于能在纯文本环境中安全传输二进制数据,避免特殊字符引起的协议冲突。在工程实践中,Base64常用于HTTP认证头、电子邮件附件、图片内嵌(如data URI scheme)以及系统间二进制数据交换。针对C++项目,cpp-base64库提供了RFC 4648标准兼容的实现,支持标准Base6

weixin_33861800的博客 437

C++ 使用base64进行编码和解码

使用base64对中文或者英文数据进行编码和解密操作

小米的修行之路 3886

C/C++实现编解码Base64

Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。

吻等离子的博客 1245

C++详解Base64编解码原理以及Base64编解码接口实现(附源码)

本文详细讲述Base64编码相关的内容,以及Base64编解码的代码实现。 1、Base64编码帮我们解决的实际问题 我们在使用libjingle(客户端)和XMPP服务器实现IM聊天功能时,测试过程中发现,当发送信息的包含一些特殊字符(不可识别字符)时,XMPP服务器会强行将客户端断开。起初很是奇怪,为啥随便发几个消息后,XMPP服务器就将libjing...

dvlinker的技术专栏 5397

用OpenSSL 做Base64 编解码(C++)

参考: http://www.ioncannon.net/programming/34/howto-base64-encode-with-cc-and-openssl/ http://www.ioncannon.net/programming/122/howto-base64-decode-with-cc-and-openssl/ 注意: 1)原文Encode示例代码中有一

yasi_xi的专栏 2万+

基于VC++的Base64编解码实现与实战解析

Base64标准字符集由RFC 4648正式定义,共64个字符,排列如下:该字符集的设计充分考虑了以下几点:可打印性:所有字符均为ASCII中可显示字符,不会触发控制字符行为。广泛兼容性:A–Z 和 a–z 在所有系统中均支持良好;数字0–9直观易读;和在URL之外环境普遍可用。排序友好:字符大致按语义分组(大写→小写→数字→符号),便于人工识别与调试。然而,和在某些上下文中存在特殊含义(如URL中表示空格,为路径分隔符),因此催生了变种方案。

weixin_35950531的博客 828

探索高效编码:C++ 实现的 Base64 编解码库

在现代软件开发中,数据传输和存储的安全性与效率至关重要。Base64 编码作为一种广泛使用的数据编码方式,能够将二进制数据转换为文本格式,便于在网络传输或存储中使用。为了满足这一需求,我们推出了一个高效且易于集成的 C++ 实现的 Base64 编解码库。 这个项目不仅提供了基本的 Base64 编码和解码功能,还通过简洁的接口设计和高效的算法实现,确保了在各种应用场景中的高性能表现。无论你是开...

gitblog_00681的博客 1265

c++图片与base64互转

c++图片与base64互转 代码直观可用,已经测试,可直接调用,需要用到OpenCV读取图片

从零开始:YOLOv8车牌检测模型训练全流程实战

本文详细介绍了从零开始训练YOLOv8车牌检测模型的全流程实战指南。内容涵盖环境搭建、数据集收集与标注、模型配置与训练、评估测试及高级优化技巧。通过使用预训练模型和迁移学习,开发者可以高效构建精准的车牌检测系统,并掌握模型导出与部署的关键步骤。

weixin_29061041的博客 335

C++实现Base64编解码并应用于图片传输

前言 最近接触的项目有一个小功能是在服务器(C++)和客户端(Python)之间传输图片,开始这部分是由另外一位同学完成的。但由于服务器是用C++写的,他不是很熟悉,所以让我来完成这部分功能。在项目中遇到了传输问题,还有文件输入输出的问题(又要复习了)。 先说一下图片传输过程中为什么要编解码。其实类似的问题在学习计算机网络中就遇到过了,回想计算机网络中要对帧进行帧定界,就是为了使信息位中出现的...

Tyler_Zx的博客 8886

从零构建:用Arduino和MCP2515模块搭建你的第一个CAN Bus网络

本文详细介绍了如何使用Arduino和MCP2515模块从零搭建CAN Bus网络,实现温湿度数据的传输与显示。涵盖硬件连接、软件配置、发送端与接收端代码实现,以及系统调试和进阶应用,帮助初学者快速掌握CAN总线通信技术。

d6e7f8的博客 832

Base64编解码C++代码实现

Base64编解码C++代码实现 【下载地址】Base64编解码C代码实现 本仓库提供了一套高效且实用的Base64编解码解决方案,专为C++开发者设计。Base64编码是一种在多媒体互联网邮件中广泛使用的数据编码方式,旨在将非ASCII字符的数据转换成标准的ASCII字符序列,以便能够在文本格式的通信中安全传输八位字节...

gitblog_09807的博客 738

连接HP C7000 OA管理口操作文档

必备工具:1台便携式笔记本电脑、1根网线 2、 在C7000机箱背面找到 OA管理模块,如图:图标1和2为OA主备管理模块 将网线一端接至左边的OA管理网口,另一端接至便携式笔记本电脑网口,如图下位置: 在C7000液晶面板下查看OA管理口地址,如图,按下液晶面板的OK按钮 然后按下▼按钮调至Enclosure Info这一项后,按下OK按钮,输出界面如图:可以看到当前Active的OA管理口IP地址 比如显示地址为172.16.25.30,则个人笔记本电脑则配置172.16...

马晓援的博客 6011

大红球预警版-精选+自定义板块监控

这是一款简单易用的股票大单资金监控插件,兼容通达信软件,可嵌入分时图或定制版面。它以红绿圆球直观显示主力买卖情况(红球为买,绿球为卖),支持300万以上大单语音播报。插件提供实时资金流向分析、多股同时监控、自定义预警条件等功能,无需L2账号。用户可自由切换图形/列表模式,监控特定板块,并配合幻影软件实现自动交易。虽然上涨股通常红球占优,但需结合其他指标综合判断。该插件完全免费,包含详细视频教程,适合新手使用。

guleba的博客 1793

Base64编解码及其C++实现

这两天在为公司的框架添加一个Base64加解密的模块,于是就想分享一下Base64的原理及自己的C++实现,借鉴了poco库。博文中的代码都是这两天写的代码的简洁版,可以完成Base64的编解码,方便易用。 不推荐造轮子,但是轮子在别的车上,你得自己拆下来,然后根据自己车的尺寸DIY你的轮子,安在自己的车上,当然,你还需要了解这个轮子的原理,万一哪天轮子坏了要你来修呢。 Base64简介 B...

FlushHip 2万+

相控阵多功能雷达工作模式识别技术综述

本文综述了相控阵雷达工作模式识别技术的研究进展。首先介绍了相控阵雷达的典型工作模式分类及其信号特征参数,包括搜索模式(VS、RWS、TWS)、跟踪模式(STT、MTT、TAS)和其他模式(SAM、SAR)等。随后重点阐述了基于信号特征的识别方法,包括时域特征(PRI分析、脉冲幅度包络、数据率)、频域特征(载频变化、调制方式)和混合特征分析方法。最后讨论了当前技术面临的挑战与发展趋势,包括复杂信号环境下的识别难题、新型雷达技术的适应需求以及深度学习技术的应用前景。该领域的研究对电子侦察和威胁评估具有重要意义。

Grow into a more wonderful you 1796

【Qt】【Base64】 Base64简单介绍和Qt下Base64编解码

什么是Base64: 参考: Base64编解码及其C++实现 什么是Base64? “Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法”。 Base64,就是使用64个可打印字符来表示二进制数据的方法。 我:简单的来说就是把二进制的数据,按每6位(2的6次方=64)读取再转换为可打印字符(64个,且...

weitaming1的博客 2519

保姆级教程:用sw_urdf_exporter插件将Solidworks机械臂模型转为ROS可用的URDF

本文提供了一份详细的保姆级教程,指导用户使用sw_urdf_exporter插件将Solidworks机械臂模型转换为ROS可用的URDF文件。从环境准备、插件配置到模型预处理和关键参数设置,再到ROS环境集成测试和性能优化,全面覆盖了机械臂URDF转换的全流程。特别适合机器人工程师和ROS开发者快速实现Solidworks模型到ROS环境的无缝迁移。

weixin_29300931的博客 399

计算机视觉入门:从像素到理解的旅程

计算机视觉入门:从像素到理解的旅程,计算机视觉是人工智能领域的核心方向之一,旨在让计算机具备理解和解释视觉信息的能力。本文以系统化的知识框架,结合 Python 代码与经典案例,带您从像素级操作逐步掌握计算机视觉核心技术。涵盖图像处理、特征工程、传统机器学习到深度学习模型,助您构建从基础到进阶的完整能力体系。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 18万+

超级好用的C++实用库之Base64编解码

Base64是一种编码方式,用于将二进制数据转换为可打印的ASCII字符。这种编码方式常用于在HTTP协议等应用中传输二进制数据,比如:图片、音频、视频等。Base64编码的原理是:将每3个字节(24位)的二进制数据转换为4个ASCII字符(每个字符6位)。具体来说,Base64编码表包含64个字符,包括:A-Z、a-z、0-9、+、/这64个字符。编码时,将每3个字节的数据按照指定的规则转换为4个Base64字符。

hope_wisdom的技术博客 1819

【科研数据获取】根据Excel表个中的企业/公司信息批量获取经纬度坐标,并进行地图可视化

批量获取企业/公司的经纬度坐标,并进行地图可视化1 需求2 实现途径3 需求逐步实现 1 需求 在做项目的时候,老板或者项目答辩时候甲方最喜欢看到的就是可视化结果,尤其是涉及到地图可视化。很多时候会遇到企业/公司的数据,想要做地图可视化,必不可少的就是要获取它们具体地址:第一种就是像查户口一样精准一下具体的城镇街道,还有一种就是经纬度信息,前一种属于文字内容往往用于管理方面,第二种数字信息多用于数据处理与分析。 2 实现途径 获取地理信息数据,自然需要使用到地图的功能,这里直接采用百度地图的拾取坐标系统,

lys_828的博客 2337

C++ Base64编码库终极指南:轻松实现高效编解码

还在为二进制数据传输而烦恼吗?🚀 无论是网络通信还是数据存储,Base64编码都是解决二进制数据文本化传输的必备技能。今天介绍的这款轻量级Base64解决方案——cpp-base64库,将彻底改变你的开发体验! ## 为什么选择这个库? ⭐ **零依赖设计**:纯C++实现,无需任何第三方库,真正实现开箱即用 ⭐ **跨平台兼容**:支持C++11及以上标准,Windows/Linux/ma

gitblog_01118的博客 464

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

订阅内容解码失败(非base64码)_你不知道的Base64URL编解码

本文原创作者一个程序员的奋斗史,如需转载,请先征得作者本人同意。不同于网络博客中的各种文章,下面的所有描述均经过仔细测试,如有不合适的地方需要讨论或有源码需求,请私信联系。来源在软件开发数据加解密过程中,经常会遇到Base64编解码。刚好工作内容会涉及到将逆向人员直接反编译所得的Java代码用C++实现应用于产品,其中经常出现Base64编解码出现问题,自己实现的C++版本URLDecode出来的...

weixin_39628160的博客 1万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

c++ Base64 编解码实现

c++ Base64 编解码实现

qq_43420088的博客 800

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

上一篇: C++引用详解
下一篇: C++ vector用法
hack_tian
博客等级 码龄16年 38粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值