Base64系列第三篇 C/C++中使用Base64编码解码(使用boost库)

boost库实现Base64编解码   Base64介绍 Base64是一种基于64个可打印字符来表示二进制数据的表示方法,从本质上看Base64编码就是将三字节转换为四字节,如果数据的长度不是3的整数倍,就要在后面补0再计算,每补2个0就再Base64串后加上1个‘=’。 boost库Base64 boost库对Base64编解码进行很了很好的封装,以下代码用boost库实现Base64编解码 //boost库引用文件... 阅读详情

本文地址:http://blog.youkuaiyun.com/morewindows/article/details/11922519转载请标明出处,谢谢。

欢迎关注微博:http://weibo.com/MoreWindows   

 

本系列一共四篇:

1. 《Base64系列第一篇 Base64介绍》

2. 《Base64系列第二篇 python中使用Base64编码解码》

3. 《Base64系列第三篇 C/C++中使用Base64编码解码(使用boost库)》

4. 《Base64系列第四篇 C/C++中使用Base64编码解码(从chromium库中抽取)》

本篇《Base64系列第三篇 C/C++中使用Base64编码解码(使用boost库)》将介绍如何使用boost库来完成Base64的编码解码

由于boost库良好的封装,所以使用boost来完成Base64编码解码非常方便,下面直接上代码了:

//  Base64系列第三篇C/C++中使用Base64编码解码(使用boost库)
//  by MoreWindows( http://blog.youkuaiyun.com/MoreWindows )   
//  欢迎关注http://weibo.com/morewindows  
#include <boost/archive/iterators/base64_from_binary.hpp>
#include <boost/archive/iterators/binary_from_base64.hpp>
#include <boost/archive/iterators/transform_width.hpp>
#include <string>
#include <iostream>
#include <sstream>
using namespace std;
bool Base64Encode(const string& input, string* output) {
  typedef boost::archive::iterators::base64_from_binary<boost::archive::iterators::transform_width<string::const_iterator, 6, 8> > Base64EncodeIterator;
  stringstream result;
  copy(Base64EncodeIterator(input.begin()) , Base64EncodeIterator(input.end()), ostream_iterator<char>(result));
  size_t equal_count = (3 - input.length() % 3) % 3;
  for (size_t i = 0; i < equal_count; i++) {
    result.put('=');
  }
  *output = result.str();
  return output->empty() == false;
}

bool Base64Decode(const string& input, string* output) {
  typedef boost::archive::iterators::transform_width<boost::archive::iterators::binary_from_base64<string::const_iterator>, 8, 6> Base64DecodeIterator;
  stringstream result;
  try {
    copy(Base64DecodeIterator(input.begin()) , Base64DecodeIterator(input.end()), ostream_iterator<char>(result));
  } catch(...) {
    return false;
  }
  *output = result.str();
  return output->empty() == false;
}

int main()
{
  cout<<"    Base64系列第三篇C/C++中使用Base64编码解码(使用boost库)"<<endl;
  cout<<"  -- by MoreWindows( http://blog.youkuaiyun.com/MoreWindows ) --"<<endl;
  cout<<" - http://blog.youkuaiyun.com/morewindows/article/details/11922519 -"<<endl;

  string input_str("MoreWindows - http://blog.youkuaiyun.com/morewindows?viewmode=contents ~!@#$%\r\n");
  string base64_str, output_str;

  cout<<"origin text: \n"<<input_str<<endl;

  Base64Encode(input_str, &base64_str);
  cout<<"encode: \n"<<base64_str<<endl;

  Base64Decode(base64_str, &output_str);
  cout<<"decode: \n"<<output_str<<endl;

  return 0;
}

运行结果如下:

         

 

如果不想使用boost库,还可以参考《Base64系列第四篇 C/C++中使用Base64编码解码(从chromium库中抽取)》,这里将从大名鼎鼎的chromium库抽取代码,保证健壮高效的完成Base64编码解码。


 

本文地址:http://blog.youkuaiyun.com/morewindows/article/details/11922519转载请标明出处,谢谢。

欢迎关注微博:http://weibo.com/MoreWindows   

 

Base64系列第三篇 C/C++中使用Base64编码解码 使用boost库 阅读详情

相关推荐

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++ Boost库实现 Base64编解码

C++Base64编解码 实现

勤又氪猿的博客 2994

C++实现图片Base64编码解码:从原理到工程实践

Base64编码是一种将二进制数据转换为ASCII文本字符串的编码方案,其核心原理是将每3个字节(24位)的二进制数据重新打包为4个可打印字符。这项技术解决了二进制数据在纯文本协议(如JSON、XML、HTTP)中传输和存储的难题,具有广泛的技术价值。在Web开发、数据序列化和资源内嵌等应用场景中,Base64编码确保了数据的完整性与可读性。本文聚焦于C++工程实践,详细解析如何手动实现二进制图片数据与Base64字符串之间的互转,涵盖了核心算法、文件IO操作以及性能优化等关键环节,并深入探讨了内存管理和边

weixin_34211761的博客 346

C/C++中使用Base64编码解码(使用boost库)

Base64是一种基于64个可打印字符来表示二进制数据的表示方法,从本质上看Base64编码就是将三字节转四字节。 如将字符串“Man”用Base64编码。 如果数据的长度不是3的整数倍,就要在后面补0再计算,每补2个0就在Base64串后加上1个‘=’。 Base64编码表如下:   Base64的不足之处 标准的Base64并不适合直接放在URL里传输,因为URL编码器

喻大帅的软件工作室 1万+

C++实现Base64编解码:原理、优化与工程实践

数据编码是计算机科学中处理数据表示与传输的基础技术,其核心原理在于将信息从一种格式转换为另一种格式,以确保在不同系统或协议间的兼容性与安全性。Base64编码作为一种经典的二进制到文本的编码方案,通过将每3个字节(24位)数据映射为4个可打印ASCII字符,巧妙地解决了二进制数据在纯文本环境(如电子邮件、JSON、XML)中传输和存储的难题。这项技术的工程价值在于其广泛的应用场景,例如在HTTP协议中嵌入认证信息、在Data URL方案内嵌图片以减少网络请求,或在日志系统中安全输出二进制数据。本文以C++语

weixin_30861459的博客 389

C++高性能JWT库JWT-CPP实战:从集成到生产环境部署

JSON Web Token(JWT)是一种用于安全传输声明的开放标准,广泛应用于现代Web服务与分布式系统的身份认证与授权。其核心原理是基于JSON格式的令牌,通过数字签名确保信息的完整性和不可篡改性,实现了无状态会话管理。在C++高性能开发领域,集成JWT功能常面临生态库选择少、依赖复杂的挑战。JWT-CPP作为一个header-only库,以其零依赖集成、全面的算法支持和灵活的JSON后端适配能力,为C++项目提供了高效、安全的JWT解决方案。该库支持HMAC、RSA、ECDSA等主流签名算法,并能无

weixin_33889665的博客 435

Boost 图片/文件转base64编码

Boost 图片/文件转base64编码1. Boost的Base642. 实例3. 总结 1. Boost的Base64 Boost实现了base64的编码,包含在头文件: #include "boost/archive/iterators/binary_from_base64.hpp" #include "boost/archive/iterators/base64_from_binary.hpp" #include "boost/archive/iterators/transform_width.h

小小的进步 1041

各种加密解密实现(Base64加密、MD5、SHA、AES RAS等)

各种加密解密的实现,包含(Base64加密、MD5、SHA、AES RAS等)

Base64系列第四篇 C/C++中使用Base64编码解码 从chromium库中抽取

Base64系列第四篇 C/C++中使用Base64编码解码 从chromium库中抽取

qq_43678306的博客 365

从‘炼丹’到‘讲理’:物理信息神经网络(PINN)的硬约束 vs 软约束,我该选哪个?

本文深入探讨了物理信息神经网络(PINN)中硬约束与软约束的选择策略,帮助研究者在深度学习中有效融入物理先验知识。通过对比两种约束方法的实现复杂度、数据效率和计算性能,提供了针对材料科学和流体动力学等领域的实用决策指南,并介绍了自适应约束和混合约束等前沿技术。

weixin_42535703的博客 527

一、两电平IGBT整流器

电压源换流器(Voltage source converter,VSC)连接交流主网和直流电网,起到交直流网络连接、功率输送和电能变换的作用。采用电压控制手段可维持直流电压的稳定;或采用功率控制手段保证系统功率输出达到预期。VSC的三相电压平衡方程如式(1)所示:式中,igx和ugx分别表示主网三相电流与电压(x=a,b,c);ucx表示换流器VSC 交流输出电压;Rg表示交流主网等效电阻;Lg表示交流主网等效电感。

TUCHACHINA的博客 4159

Base64系列第四篇 C/C++中使用Base64编码解码(从chromium库中抽取)

本篇《Base64系列第四篇 C/C++中使用Base64编码解码(从chromium库中抽取)》将从大名鼎鼎的chromium库抽取代码,保证健壮高效的完成Base64编码解码。

MoreWindows Blog 3万+

”COMSOL“竟然如此简单!我悟了!!

COMSOL Multiphysics具有强大的多物理场全耦合仿真分析功能、高效的计算性能,可以保证数值仿真的高度精确,已被广泛应用于各个学科领域,近年来运用COMSOL来解决电化学实际工程问题也越来越普遍。

C1012562281的博客 3447

Base64系列第一篇 Base64介绍

Base64系列第一篇 Base64介绍

ffygvf的博客 145

axi ps读写pl_PL读写DDR:Datamover能干什么

最近发现工程项目中一直在用AXI-DMA。这玩意儿搬数据倒是没问题,就是用axi-lite配置起来非常反人类。。。简单的办法其实是用datamover ip核。这个ip核能干嘛呢。准备写个文章解析一下。由于好多feature没用过,所以仅仅看文档可能理解有误,欢迎指出错误。首先扫个盲:MM2S指的是Memory map to stream. 读DDR. S2MM指的是steam to memory...

weixin_35908791的博客 1597

最大面积验证码通用解法

最大面积验证码、面积验证通用解法

九月镇灵将的博客 1044

C++实现base64编码

将昨天的php代码改造成C++ /*base_64.h文件*/ #ifndef BASE_64_H #define BASE_64_H /** * Base64 编码/解码 * @author liruixing */ class Base64{ private: std::string _base64_table; static cons...

398

一文搞懂鲸鱼优化算法Whale Optimization Algorithm(WOA)!!!(核心原理+数学模型+代码实战+实际应用)

本文详细介绍了鲸鱼优化算法(WOA)的原理与实现。该算法模拟座头鲸气泡网捕食行为,通过包围猎物、螺旋攻击和随机搜索三种策略平衡全局探索与局部开发。文章首先从生物学角度解释鲸鱼捕食行为,然后给出算法的数学模型和完整流程,包括关键公式和决策逻辑。最后通过Python代码实例演示如何求解Sphere函数最小值,展示算法的实际应用。WOA具有结构简单、参数少等优点,在工程优化、机器学习等领域有广泛应用前景。

qq_42212808的博客 1011

base64 编码 在websocket协议中的应用

base64 编码 在websocket协议中的应用 一 、base64作用 1、参数传输的过程中使用 2、传输二进制图片,可以将字符直接插入页面中 3、基于64个可打印的字符转换表示二进制的数据 二、缺陷 1、明显会增长数据的量,尤其是图片转化,增长三分之一左右,这个量其实不小了 三、代码 show me the code 我们知道websocket协议建立在http协议基础之上,实现websocket协议前面要实现一段http协议代码,然后upgrade,在websocket协议中,RFC6455 文档

qianbo042311的博客 1421

FP16、BF16、INT8、INT4精度模型加载所需显存以及硬件适配的分析

本文主要介绍了FP16、INT8、INT4精度模型加载占用显存大小的分析,希望对学习大语言模型的同学们有所帮助。 文章目录 1. 前言 2. 模型加载显存占用大小 3. 不同精度是否与硬件适配

herosunly的博客 23万+

5G/NR SSB学习总结

6.1 SSB概念 同步信号和PBCH块(Synchronization Signal and PBCH block, 简称SSB),它由主同步信号(Primary Synchronization Signals, 简称PSS)、辅同步信号(Secondary Synchronization Signals, 简称SSS)、PBCH三部分共同组成。 6.2 SSB特征 ...

欢迎来到小七的博客,这里将带你深入探索5G通信的神秘世界。无论你是通信领域的专业人士还是对这一领域充满好奇心的技术爱好者,这里都有专业协议解读、通信知识普及以及有趣的Python编程内容等你发现。 8万+

自己用过的好用的C++第三方库汇总

目录 综合库 Boost 网络库 cpp-httplib 简介 链接 工具库 cpp-base64 简介 链接 综合库 Boost 官网地址:https://www.boost.org/ 编译好的库下载地址:https://sourceforge.net/projects/boost/files/boost-binaries/ 网络库 cpp-httplib 简介 一个C++ 11只包含头文件的跨平台HTTP/HTTPS库。 设置非常容易。 只需在代码中包含htt.

xuyouqiang1987的博客 5294

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

C++学习之Base64

一般是不会用string来存储内存的内容的,而是用unsigned char*来做这样的事情。 但是如果图方便要用string来表达内存的内容就要用到base64,下面是我用到的一段代码,整理一下备忘。 #include #include #include using namespace std;  // base64 tables static char ba

Coder 1337

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C++ POCO库(访问数据库,版本问题,本人配置失败)

官网下载源码:https://pocoproject.org/ 一、POCO库简介 学习一个框架前,要先明白它的是什么,为什么,怎么用.下面这些文字,是从中文poco官网上转过来的,正如poco c++库的特点,非常清晰,代码风格更是一目了然. poco开发库的特点,非常适合写后台处理程序,效率也是很高的.前台界面程序使用Qt框架库,非常好,两个库相辅相成,可解决项目上的大部分问题. ...

csdndenglu的专栏 2390

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

上一篇: Base64系列第一篇 Base64介绍
下一篇: Base64系列第四篇 C/C++中使用Base64编码解码(从chromium库中抽取)
MoreWindows
MoreWindows 《白话经典算法》、《秒杀多线程》作者 《白话经典算法》、《秒杀多线程》作者 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
博客等级 码龄15年 2万+粉丝 157原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值