java魔数

Java文件魔数校验实战:从原理到代码实现文件类型安全识别 文件类型识别是计算机系统与应用程序处理数据的基础环节,其核心原理在于解析文件的二进制结构特征。传统依赖文件扩展名的方式存在安全风险,易被恶意篡改。通过读取文件头部特定字节序列(即魔数,Magic Number)进行校验,能够从二进制层面准确识别文件真实格式,这是实现文件安全上传、自动化分类与数据防伪的关键技术。在Java开发中,利用字节流读取与十六进制转换技术,可以构建高效、可扩展的魔数校验器。该技术广泛应用于Web应用安全防护,能有效防御恶意文件上传攻击,并结合文件扩展名白名单、内容深度解析等构成多层防御 阅读详情

背景

以前偶尔听朋友说过魔数,但是从来没有深入学习过,最近又开始经常听到这个字眼,所以觉得有必要认真了解一下。。。

类型

1、标识文件类型的“魔数”

大多数情况下,我们是通过扩展名来识别一个文件的类型的,比如一些.java,.txt文件等,我们都能清楚知道它是什么文件,那一旦一个文件的扩展名被修改过,怎么识别一个文件的类型呢,这就是用到了魔数。

很多类型的文件,其起始的几个字节内容都是固定的,因此这几个字节的内容也被称为魔数。因为根据这几个字节的内容就可以确定文件类型了,有了这些魔数,我们就可以很方便的区分不同的文件。
为了方便虚拟机识别一个文件是否是class类型的文件,SUN公司规定每个class文件必须以一个word(四个字节)作为开始,这个数字就是魔数。魔数由四个字节的无符号数组成的,class的魔数是0XCAFEBABE。
我们可以随便编译一个class文件,然后用十六进制的编辑器打开编译后的class文件基本前面的内容,都是一致的,如下:
在这里插入图片描述

2、代码中的魔数

有一些代码中,一些数字常量或者是字符串,没有注释,而且从命名上也看不出是什么意思,很可能再过一段时间之后谁也不知道这个常量是什么意思,我们就称这个常量或者字符串为魔数。

在《阿里巴巴Java开发手册》中有关于魔数的要求:
在这里插入图片描述
在代码中使用魔数,不仅使得代码可读性降低,还可能造成各种问题,所以我们要尽量避免魔数。

所以需要使用魔数的地方,我们可以使用枚举值或者是静态变量来代替。

举例:
在这里插入图片描述
在这个方法里,“programmer”,“tester”和“analyst”是所谓的魔字符串,而500,700,800和1000就是魔数,咋一看,代码这么写是没有问题的,但是仔细思考后就会发现,如果这种代码散布在程序中,随处可见,那将是多么可怕。。
可以采用如下方式代替:

在这里插入图片描述

java-文件工具,可以查看文件类型,文件魔数,可以判断是否是视频文件,音乐文件,图片文件等等 java文件的工具类,封装了常用的操作,尤其针对文件的实际类型,通过获取文件的byte,来查看文件起始字节的魔数值,通过魔数值来判断文件的类型,工具集合了常用的文件类型对应的魔数,也封装了文件类型的判断方法 立即下载

相关推荐

tewa-707e光猫超级密码获取方法

这款光猫很魔性,没有WIFI,没有USB接口,没有Telnet,试了很多方法去获取超级密码都不行。解密时可能会报错,可能是文件后面部分不晓得是咋拼接过来的,用AES解密时分组数据有问题。3、这个文件是用AES加密了的,直接打开是乱码,所以得用AES解密,key为16个字节的 x00。打开解出来的文件,然后搜索 telecomadmin,就可以发现超级密码了。参考资料里面的光猫不是同一款,但解密的方法基本相同的。

shaowl111的专栏 1万+

Java 中的魔数

魔数用于标识文件的格式,java的Class文件的魔数为CAFEBABE

gao_zhennan的博客 2666

LightTools宏 vs Python API:光学仿真自动化方案选型指南

本文深入对比了LightTools光学仿真自动化中VBA宏与Python API两种方案。VBA宏内嵌易用,适合固定流程批处理;Python API生态强大,尤其在参数优化算法集成方面优势显著,便于构建复杂工作流。文章结合案例,为不同场景下的技术选型提供清晰指南。

garlic的博客 940

Java冷知识之——魔数(Magic Number)

一、 编程中的魔数 在阿里巴巴Java开发手册编程规约第二节常量定义的第一条中写道: 魔法值(即魔数)指的是未经预先定义的常量,而反例中的 “Id#taobao_” 则叫做魔字符串(Magic String)。这一规定在《Clean Code》和各大公司的代码规范手册中都有被提及过,那为什么这样规定呢? 《计算机程序的构造和解释》一书中表达过这种观点: 代码的第一要义是供人类理解,其次才是能正...

qq_41297896的博客 8445

产业大脑+未来工厂:揭秘浙江数字经济系统的5大核心场景搭建指南

本文深入解析了“产业大脑+未来工厂”这一浙江数字经济系统的核心范式,并提供了五大核心场景的实战搭建指南。文章详细阐述了从供应链协同、产能共享到产品创新、质量追溯及绿色低碳等关键场景的构建逻辑与技术架构,旨在帮助企业实现从技术驱动到场景驱动的价值落地,破解数据孤岛难题,提升产业链整体效能。

mac99的博客 666

kali2020.2安装出现的问题并附详细解决办法

kali2020.2的安装

weixin_48776804的博客 3047

Java 通过魔数判断上传文件的类型

使用魔数值校验,不管是传入的文件有后缀名,还是无后缀名,或者修改了后缀名,真正获取到的才是该文件的实际类型,这样避免了一些想通过修改后缀名或者Content-type信息来攻击的因素。但是性能与安全永远是无法同时完美的,安全的同时付出了读取文件的代价。本人建议可采用后缀名与读取文件的方式结合校验,毕竟攻击是少数,后缀名的校验能排除大多数用户,在后缀名获取不到时再通过获取文件真实类型校验,这样来适当提高性能。

weixin_45636743的博客 2468

Windows环境Oracle19C安装与配置全攻略

本文详细介绍了在Windows环境下安装与配置Oracle19C数据库的完整流程,包括环境准备、安装步骤、网络配置、客户端工具设置及常见问题解决方案。特别针对Windows 10和Windows Server 2016及以上版本提供了优化建议,帮助用户高效完成Oracle19C的部署与维护。

weixin_28455801的博客 487

Java 中文件之魔数

Java 中令人匪夷所思的 Magic 之魔数 先来讲讲一个故事,公司突然有一个需求,客户提交的文件,让你获取到他提交的文件到底是一个什么文件,这个不是小事一桩吗?直接上代码。 public static String getFileTypeByExt(String filePath) { if (StringUtils.isBlank(filePath)) { return null; } return filePath.toLowe

weixin_44109717的博客 1468

R语言绘制森林图

运行上述代码后,将会生成一个标题为"森林图示例"的森林图。通过以上代码示例,你可以根据自己的数据集和需求创建定制的森林图。在实际应用中,你还可以进一步调整图形的样式,添加图例、坐标轴标签等,以使森林图更加美观和易于理解。在数据可视化领域,森林图是一种常用的图形类型,用于展示多个分类变量之间的关系。本文将介绍如何使用R语言创建森林图,并提供相应的源代码示例。森林图通常由垂直的线段表示不同类别的观测值,并且线段的长度表示数值变量的大小。上述代码中,我们为不同的类别分别指定了蓝色和红色作为颜色映射关系。

TechNovaX的博客 1045

万字长文解密:SAP Fiori 首屏加载缓慢背后的真相

什么是一个健康理想的 Fiori 首次加载状态?FLP 首页不臃肿,用户默认看见的内容不多但足够用缓存作业按规则运行,冷启动不至于每次都从零开始应用首屏只读必要数据,UI5 资源经过 preload,视图异步加载OData 服务字段克制、分页合理、缓存分层清楚后台 CDS 与 HANA 只为当前屏幕做最必要的工作。只要这些标准同时满足,用户第一次打开 Fiori 页面的体感通常会从明显卡顿变成可接受甚至顺滑。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 556

Java 对上传文件进行魔数校验

魔数这个词在不同领域代表不同的含义。在计算机领域,魔数有两个含义,一指用来判断文件类型的魔数(magic number);二指程序代码中的魔数,也称魔法值。 不是所有文件都有文件头的.一个.txt类型的文件是一个纯文本文件,没有文件头。 参考文章: 百科 魔数 Java 通过魔数判断上传文件的类型 项目中接到魔数校验的需求,这篇文章(Java 通过魔数判断上传文件的类型)对我理解很有帮助,在此基础上,我重新写了工具类的处理,通过文件路径或者文件流获取文件类型(文件类型与对应的文件魔数枚举类).

Charge8的博客 6535

PCB制造工艺参数到AD规则设置

本文提供了PCB设计与制造的落地指南,强调需先了解PCB厂的工艺参数,再在Altium Designer中设置相应规则。核心步骤包括:获取PCB厂的关键工艺参数(线宽/线距、过孔尺寸等),在AD中设置电气规则、布线规则、阻焊规则等,并进行DRC检查。文章还给出了常见问题避坑建议和快速落地模板,帮助设计师确保设计符合生产要求,避免因工艺不匹配导致的报废或成本增加。

qq_37999850的博客 292

java校验文件魔数

给大家整理了一些有关【Java】的项目学习资料(附讲解~~):https://edu.51cto.com/course/35714.html以一些关于【文件类型】的学习资料和大家一起分享一下:https://edu.51cto.com/video/27644.htmlJava 校验文件魔数 在计算机文件中,魔数(Mag...

weixin_35731754的博客 593

深度学习工具包 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")

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

小知识 | Java中的“魔数

转载自&nbsp;小知识 | Java中的“魔数”在编程过程中,我们可能经常听到“魔数”这个词,那么这个词到底指的是什么呢?什么数叫做魔数呢?一、标识文件类型的“魔数”大多数情况下,我们都是通过扩展名来识别一个文件的类型的,比如我们看到一个.txt...

BoomLei的博客 2381

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

java中的魔数是什么意思?

代码中直接出现的、无注释说明含义的数字常量,是典型的编程反模式,会导致代码可读性差、维护成本高。用常量替代魔数,给常量起有意义的名字:java运行// 常量命名清晰,含义一目了然// 奖金比例// 法定成年年龄// 高薪阈值return 0;类型核心含义处理方式字节码魔数.class 文件开头的 0xCAFEBABE,验证合法性JVM 自动校验,开发者无需干预编程魔数硬编码的无意义数字常量用常量 / 枚举替代,提升可读性让数字有 “名字”,而非让读者猜 “含义”。

qsxxlc的博客 662

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Java获取文件的真实类型(通过文件魔数判断文件类型)

背景 通常情况下,我们取文件的后缀名作为文件的类型即可,但有时为了防止用户随便修改后缀名,就需要获取文件的真实类型。这时候可以通过文件的魔数来判别。魔数就是文件开头的那几个字节的数据。 代码实现 工具类代码 import java.util.HashMap; import java.util.Map; /** * @author lixk * @description 魔数工具类 */ p...

浅醉樱花雨的专栏 1万+

java 魔数_Java 字节码结构解析

本文通过解析Class文件中字节码的结构,来加深对Java类文件结构的理解。建议先阅读Java类文件结构解析这篇文章。Test.javapackage org.tianbin.clazz;public class Test{private int m;public int inc(){return m + 1;}}Test.classCA FE BA BE 00 00 00 34 00 13 0A...

weixin_30744857的博客 289

Java类文件结构深度解析:从魔数到方法表

Java类文件结构深度解析:从魔数到方法表 【免费下载链接】jvm ???? JVM 底层原理最全知识总结 项目地址: https://gitcode.com/gh_mirrors/jvm9/jvm ...

gitblog_00235的博客 767

java字节码文件魔数的由来

关于魔数的解释和疑问 java字节码文件的前4个字节是0xCAFEBABE,也被称呼为魔数,但是为什么要使用魔数来进行字节码文件的判断呢,为什么不适用后缀名进行判断呢   其实使用后缀也是可以的,只不过无法确保用户会不会手动修改文件的后缀名,所以使用了魔数来进行判断  魔数内容的由来 CAFEBABE象征着著名的咖啡品牌 Peet' s Coffee 中 深受欢迎的Barista...

zhttly的博客 860

深入理解Java虚拟机——魔数与Class文件的版本

目录一、魔数1.1、魔数的概述1.2、魔数的作用1.3、版本号二、通过Binary Viewer工具查看编译后的Class文件2.1、Binary Viewer工具的下载与安装2.2、Binary Viewer工具查看编译后的Class文件 一、魔数 1.1、魔数的概述 每个Class文件的头4个字节称为魔数。 Class文件的魔数的获得很有“浪漫气息”,值为0xCAFEBABE(咖啡宝贝?),这个魔数值在Java还称做“Oak”语言的时候(大约是1991年前后)就已经确定下来了。 1.2、魔数的作用

小志的博客 982

java的class文件魔数和版本对应关系

使用十六进制编辑器打开class查看,CAFEBABE为class文件魔数,后面4个字节是版本号

shy_snow的专栏 676

小知识|Java中的“魔数“

在编程过程中,我们可能经常听到“魔数”这个词,那么这个词到底指的是什么呢?什么数叫做魔数呢? 一、标识文件类型的“魔数” 大多数情况下,我们都是通过扩展名来识别一个文件的类型的,比如我们看到一个.txt类型的文件我们就知道他是一个纯文本文件。但是,扩展名是可以修改的,那一旦一个文件的扩展名被修改过,那么怎么识别一个文件的类型呢。这就用到了我们提到的“魔数”。 很多类型的文件,其起始的几个字节的内容是固定的(或是有意填充,或是本就如此)。因此这几个字节的内容也被称为魔数 (magic numbe.

weixin_51393513的博客 519

java校验ZIP文件头魔数

校验ZIP文件头魔数的Java实现 作为一名经验丰富的开发者,我很高兴能够帮助刚入行的小白学习如何实现“Java校验ZIP文件头魔数”。在这篇文章中,我将详细介绍整个流程,并提供相应的代码示例。 流程图 首先,让我们通过流程图来了解整个校验ZIP文件头魔数的流程: #render_12_1447936411-svg{fon...

weixin_29713915的博客 281

解析Java的Class文件格式——解析魔数和版本号

熟悉Java语言有好几年了,技术也学了一些,现在主要从事J2ME技术方面的工作,最近工作不是很忙,就找了本电子书——《深入Java虚拟机(第二版)》,仔细阅读了一下,读起来比较吃力,现在把Java class文件格式的读书笔记共享给大家。    众所周知,Java语言的可执行文件是class文件,俗称类文件。这个文件为了让不同平台的虚拟机都能够正确的解释,详细规定了其文件格式。下面就按照顺序进

香蕉熊的专栏 1066
上一篇: Java通过URL发送GET或者POST请求
下一篇: 序列化和反序列化学习(一)
CodersCoder
博客等级 码龄10年 90粉丝 258原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值