使用BASE64实现编码和解码

news2024/11/16 17:59:40

系列文章目录

SpringBoot整合RabbitMQ并实现消息发送与接收
解析JSON格式参数 & 修改对象的key
VUE整合Echarts实现简单的数据可视化
Java中运用BigDecimal对字符串的数值进行加减乘除等操作
List<HashMap<String,String>>实现自定义字符串排序(key排序、Value排序)

更多该系列文章请查看我的主页哦


文章目录

  • 系列文章目录
  • 前言
  • 一、数据准备
  • 二、场景分析
  • 三、BASE64编码
    • 3.1 代码
    • 3.2 效果图
  • 四、BASE64解码
    • 4.1 代码
    • 4.2 效果图
  • 总结


前言

BASE64编码是一种将二进制数据转换为ASCII字符的编码方式,常用于在网络传输中传递、保存二进制数据。BASE64编码可以将任意的二进制数据转换为文本字符串形式,由于其特殊的编码方式,不易被人直接识别,也比较难以被篡改。

Java语言中提供了BASE64编码解码的支持,可以很方便地进行编码和解码操作。使用BASE64编码/解码非常简单,只需要调用相应的编码器或解码器即可。在进行BASE64编码解码时,需要注意数据类型的转换,以及一些特殊字符的处理。

下面我们来介绍如何在Java中进行BASE64编码解码操作,以及一些注意点和实例演示,帮助大家更好地掌握这个知识点。


一、数据准备

在前言中我们也了解了BASE64编码主要是在网络传输中使用,这样不易被人直接识别,也比较难以被篡改。所以我们在发送json数据时一般会用到编码,从而防止被其他人发现。

下面我们就准备一个json数据,如下所示:

{
  "status": "success",
  "data": {
    "users": [
      {
        "id": 1,
        "name": "John Doe",
        "age": 30,
        "email": "johndoe@example.com"
      },
      {
        "id": 2,
        "name": "Jane Smith",
        "age": 25,
        "email": "janesmith@example.com"
      }
    ],
    "products": [
      {
        "id": 1001,
        "name": "Product A",
        "price": 19.99
      },
      {
        "id": 1002,
        "name": "Product B",
        "price": 29.99
      }
    ]
  },
  "message": "Data retrieved successfully"
}

如果这个数据很重要,我们在传输前就要先进行编码,从而使数据更加安全的进行传输。

二、场景分析

BASE64编码在很多场景中都有广泛的应用,下面是一些常见的场景分析:

  1. 数据传输:在网络通信中,有些数据可能包含特殊字符或无法直接传输,此时可以将数据进行BASE64编码,以文本形式传输。接收端再对数据进行解码恢复到原始格式。
  2. 图片和文件传输:在Web开发中,经常会涉及图片和文件的传输。由于HTTP协议仅支持文本传输,因此需要将二进制图片或文件进行BASE64编码后,以文本形式嵌入到网页或API请求中。
  3. 数据存储:有些数据库或系统只支持文本类型的存储,无法直接存储二进制数据。在这种情况下,可以对二进制数据进行BASE64编码后存储到数据库或其他存储介质中。
  4. 密钥交换:在加密算法中,密钥的传输和存储需要保证安全性。使用BASE64编码可以将密钥从二进制转换为文本形式,以便于传输和存储。

需要注意的是,BASE64编码虽然可以保证数据传输的可靠性,但它并非加密算法,无法提供数据的安全性。因此,在涉及敏感信息的场景中,仍需要结合其他加密手段来保障数据的安全性。

三、BASE64编码

3.1 代码

通过上述的描述,大家应该对BASE64有了一定的理解,下面我们来使用java代码实现BASE64编码,就对上述的json串进行编码:

		//编码 :encode  获得字符串的byets后在进行编码jsonObject.getBytes()
        byte[] encodedBytes = java.util.Base64.getEncoder().encode(jsonObject.getBytes());
        String base64Str = new String(encodedBytes);
        System.out.println("这是编码后的base64串:" + base64Str);

具体解释如下:

  1. byte[] encodedBytes = java.util.Base64.getEncoder().encode(jsonObject.getBytes());:首先,将jsonObject对象转换为字节数组,并使用java.util.Base64.getEncoder()获取BASE64编码器,然后对字节数组进行编码得到编码后的字节数组encodedBytes。
  2. String base64Str = new String(encodedBytes);:将编码后的字节数组encodedBytes转换为字符串形式,即获取到BASE64编码后的字符串base64Str。
  3. System.out.println(“这是编码后的base64串:” + base64Str);:打印输出编码后的BASE64串。

总结:该代码段实现了将一个JSON对象进行BASE64编码,并将编码结果以字符串形式打印输出。

3.2 效果图

通过上述的代码对json串进行编码,就可以拿到编码后的字符串。运行效果如下图所示:
在这里插入图片描述

四、BASE64解码

4.1 代码

编码后我们就可以传送了,但用户在接收到json数据后需要解码后往数据库中存储或做处理,所以这里我们写解码代码如下:

		//这个转空格为"+"号 有空格转的时候会报错(非法字符)。
        String replace = base64Str.replace(" ", "+");
        byte[] basebyte = java.util.Base64.getDecoder().decode(replace);
        String utf8Str = new String(basebyte, "utf-8");
        System.out.println("这是解码后的utf-8串:" + utf8Str);

这段代码的主要功能是将一个Base64编码的字符串中的空格替换为"+"号,然后进行Base64解码,最后将解码后的字节数组转换为UTF-8格式的字符串并输出。

  1. 使用**replace()**方法替换空格为"+“号。这里使用了正则表达式” "来匹配空格,因为Java的字符串操作中,空格是一个特殊字符,需要使用正则表达式来匹配。
  2. 使用**java.util.Base64.getDecoder().decode()**方法对替换后的Base64编码字符串进行解码。解码后的结果是一个字节数组。
  3. 使用**new String(basebyte, “utf-8”)**方法将解码后的字节数组转换为UTF-8格式的字符串。
  4. 输出解码后的字符串。

需要注意的是,这段代码中使用了Java的Base64类来进行Base64编码和解码。在使用Base64.getDecoder().decode()方法解码时,解码后的结果是一个字节数组,如果需要将其转换为字符串,需要使用String类的构造方法,如new String(basebyte, "utf-8")。

4.2 效果图

通过上述的代码进行解码,就可以还原编码前的json串,效果图如下所示:
在这里插入图片描述
注意:在从字节数组转换为String类型时,如果不加utf-8会出现乱码。


总结

Base64编码的优点是可读性好,可以方便地阅读和传输,同时可以加密数据,防止数据泄露。但是,由于Base64编码的编码长度比原始数据长度更长,所以可能会导致传输速度变慢。此外,Base64编码只能加密原始数据的比特位,不能加密原始数据的值。

在Java中,可以使用java.util.Base64类来进行Base64编码和解码。常用的方法包括:

  1. encode()方法:将原始数据转换为Base64编码的字符串。
  2. getEncoder()方法:获取一个Base64编码器,用于将数据转换为Base64编码的字符串。
  3. decode()方法:将Base64编码的字符串转换为原始数据。
  4. getDecoder()方法:获取一个Base64解码器,用于将Base64编码的字符串转换为原始数据。

在使用Base64编码和解码时,需要注意原始数据的类型(如字节数组、字符串等)和编码器的选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1130952.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在Puppeteer中设置User-Agent来绕过京东的反爬虫机制?

概述 京东作为中国最大的电商平台,为了保护其网站数据的安全性,采取了一系列的反爬虫机制。然而,作为开发者,我们可能需要使用爬虫工具来获取京东的数据。 正文 Puppeteer 是一个由 Google 开发的 Node.js 库,它提供…

【无标题】读书笔记之《智能化社会:未来人们如何生活、相爱和思考》

《智能化社会:未来人们如何生活、相爱和思考》:Digital vs Human_ how well live, love, and think in the future ,由中信出版社于2017年06月出版。作者是澳大利亚的理查德沃特森(Richard Watson)。Richard Watson在伦敦帝国理工学院从事未来…

国债1万亿,你该学点什么

what: 底层逻辑:国家信用向社会募资 why: ① 战争时代-筹措military purpose ② 平衡财政收支(大部分时期都是deficit的状态,一般方法有levy.taxing,print money,national debt,当taxing与print money都困难的时候&a…

【Java集合类面试二十】、请介绍LinkedHashMap的底层原理

文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。 面试官:请介绍LinkedHashMap的底…

什么是React中的高阶组件(Higher Order Component,HOC)?它的作用是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

shopee商品链接获取shopee商品评论数据(用 Python实现shopee商品评论信息抓取)

在网页抓取方面,可以使用 Python、Java 等编程语言编写程序,通过模拟 HTTP 请求,获取shopee网站上的商品详情页面评论内容。在数据提取方面,可以使用正则表达式、XPath 等方式从 HTML 代码中提取出有用的信息。值得注意的是&#…

Linux系统安装redis并配置为服务

一、Linux环境 1、下载 官网提供的源码下载地址: https://github.com/redis/redis/archive/7.0.5.tar.gz 2、将源码上传至服务器 3、解压缩 # 将解压缩后的文件放置在同目录的source文件夹下 tar -zxvf redis-7.0.5.tar.gz -C ./source4、编译安装 对源码进行编…

【微信小程序】数字化会议OA系统之投票模块(附源码)

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《微信小程序开发实战》。🎯&#x1f3a…

有粉丝被机器视觉培训机构忽悠培训贷款

最近有13个粉丝私下联系我,咨询我培训贷款,当时我听了,挺懵的。我详细了解后,我上大学毕业的时候,也遇到过此类学校鼓励我们去培训。合理维权,切不可采用极端手段,生命比什么都重要。不要做傻事…

Vue-dvadmin-d2-crud-plus-自定义后台菜单-添加页面

文章目录 1.新建数据模型2.新建数据序列类3.新建数据视图4.配置路由5.前端新建View组件6.配置后台7.总结 django-vue-admin是一套全部开源的快速开发平台,毫无保留给个人及企业免费使用。 🧑‍🤝‍🧑前端采用D2Admin 、Vue、Eleme…

搭建nuxt3项目(框架构建)

需求 目标:我想搭建一个nuxt3的框架,实现一些基本的组件和路由、页面,方便后续遇到相关ssr项目直接复用。 同时:记录关于nuxt3的使用介绍关于Nuxt(详解以及周边) Nuxt 框架 1、一种基于 Node.js 的服务端…

Java-多线程进阶

文章目录 Java多线程进阶锁的类型乐观锁vs悲观锁读写锁重量级锁vs轻量级锁自旋锁公平锁vs非公平锁可重入锁vs不可重入锁 CASCAS介绍和原理CAS应用自旋锁CAS 的 ABA 问题 Synchronized 原理Callable 接口JUC常见类ReentrantLock原子类线程池信号量 SemaphoreCountDownLatch 线程…

Unity之ShaderGraph如何实现旋涡效果

前言 今天我们来通过ShaderGraph来实现一个旋涡的效果 如下图所示: 主要节点 Distance:返回输入 A 和输入 B 的值之间的欧几里德距离。除了其他方面的用途,这对于计算空间中两点之间的距离很有用,通常用于计算有符号距离函数 (…

JAVA基础(JAVA SE)学习笔记(八)面向对象编程(高级)

前言 1. 学习视频: 尚硅谷Java零基础全套视频教程(宋红康2023版,java入门自学必备)_哔哩哔哩_bilibili 2023最新Java学习路线 - 哔哩哔哩 第二阶段:Java面向对象编程 6.面向对象编程(基础) 7.面向对象编程&…

C++标准模板(STL)- 类型支持 (类型特性,is_void,is_null_pointer,is_integral)

类型特性 类型特性定义一个编译时基于模板的结构&#xff0c;以查询或修改类型的属性。 试图特化定义于 <type_traits> 头文件的模板导致未定义行为&#xff0c;除了 std::common_type 可依照其所描述特化。 定义于<type_traits>头文件的模板可以用不完整类型实…

【小呆的概率论学习笔记】抽样调查之用抽样样本估计母体数字特征

文章目录 1. 随机变量的数字特征1.1 随机变量的均值&#xff08;期望&#xff09;1.2 随机变量的方差1.3 随机变量的协方差 2. 抽样调查3. 用抽样样本估计母体数字特征3.1 估计母体样本均值3.2 抽样样本均值的方差3.2 估计母体样本方差 1. 随机变量的数字特征 随机变量本质上是…

手把手教你在项目中引入Excel报表组件

摘要&#xff1a;本文由葡萄城技术团队原创并首发。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 前言 GrapeCity Documents for Excel&#xff08;以下简称GcExcel&#xff09;是葡萄城公司的…

《VS2013+ Qt5.6 创建Qt对话框(*.ui 文件, *.h, *.cpp )》

标题&#xff1a;如何在Visual Studio 2013中创建Qt对话框项目 简介 在本篇博客中&#xff0c;我们将介绍如何使用Visual Studio 2013和Qt 5.6创建一个Qt对话框项目&#xff0c;包括创建.ui文件、.h文件和.cpp文件&#xff0c;以及构建一个基本的用户界面和业务逻辑。&#x…

自建的离散傅里叶变换matlab程序实现及其与matlab自带函数比较举例

自建的离散傅里叶变换matlab程序实现及其与matlab自带函数比较举例 在matlab中有自带的离散傅里叶变换程序&#xff0c;即fft程序&#xff0c;但该程序是封装的&#xff0c;无法看到源码。为了比较清楚的了解matlab自带的实现过程&#xff0c;本文通过自建程序实现matlab程序&…

DenseNet 和 FractalNet学习笔记

文章目录 网络结构模型细节下采样增长率 代码实现FractalNet 模型(2016) 网络结构 假设输入为一个图片X0&#xff0c;经过一个L层的神经网络&#xff0c;第l层的特征输出记作Xl&#xff0c;那么残差连接的公式如下所示&#xff1a; x l H l ( X l − 1 ) X l − 1 x_lH_l(X…