编码与解码

news2024/11/24 9:53:55

文章目录

  • 编码与解码
  • 一、字节 & 字符
  • 二、编码 & 解码
  • 三、字符集 & 字符编码
  • 四、ASCII
  • 五、ISO-8859-1
  • 六、GB
  • 七、Unicode
    • 1、概述
    • 2、发展
    • 3、UTF-8 编码
    • 4、UTF-16 编码
  • 八、Base64 编码
    • 1、概述
    • 2、原理
    • 3、代码示例
  • 九、十六进制编码

编码与解码

一、字节 & 字符

字节 Byte

  • 字节是计算机中常用的数据存储和传输单位,它是 8 位二进制数据。
  • 在Java中,字节数据类型是byte,它占用8位(一个字节)。

字符 Character

  • 字符是指人类可读的文本数据,通常是Unicode编码的一个字符。
  • 在Java中,字符数据类型是char,它占用16位(两个字节)。

不同编码的字节占用:

  • ASCIIISO-8859-1 中,数字、英文、标点占用一个字节,不支持汉字。
  • GBK 中,数字、英文、标点占用一个字节;汉字占用两个字节。
  • UTF-8 中,数字、英文、标点占用一个字节;汉字占用三个字节。

二、编码 & 解码

计算机中的信息都是用二进制数表示的,我们在屏幕上看到的数字、英文、标点符号、汉字等字符是二进制数转换之后的结果。

  • 编码 Encode:按照某种规则,将 字符 存储到计算机中。

  • 解码 Decode:将存储在计算机中的 二进制数据,按照某种规则解析显示出来。

按照A规则存储,同样按照A规则解析,就能显示正确的文本符号。反之,编码和解码采用不同的编码规则,就可能导致乱码

三、字符集 & 字符编码

不管是 编码 还是 解码,都需要参考一个规则。这个规则就是某一个编码表。

  • 字符集 Charset:一组字符的集合。
  • 字符编码 Character Encoding:将 字符集 中的 每个字符 映射为 二进制数据 的规则或算法。

常见字符集有ASCII字符集、GBK字符集、Unicode字符集等。

在这里插入图片描述

一套 字符集 对应着一套或多套 字符编码,而 一套 字符编码 属于一套 字符集

  • 可见,当指定了字符编码,它所对应的字符集自然就指定了。

四、ASCII

ASCII(American Standard Code for Information Interchange)美国标准信息交换代码。

  • ASCII 是一种基于 拉丁字母 的字符编码系统,用于在计算机系统中表示 文本数据 和 控制字符。
  • ASCII 定义了128个字符,包括英文字母(大写和小写)、数字、标点符号和一些控制字符。
  • ASCII 的 基本字符集,使用 7 位(bits)表示一个字符,共 128 字符。
  • ASCII 的 扩展字符集,使用 8 位(bits)表示一个字符,共 256 字符,方便支持欧洲常用字符。

下面为ASCII码表:

在这里插入图片描述

ASCII 编码:把 字符A 按照 ASCII表的规则 编码成 计算机中的二进制

字符A	  十进制	   二进制
'A' ---> 65 ---> 0100 0001  

ASCII 解码:把 计算机中的二进制 按照 ASCII表的规则 解码成 字符A

  二进制	   十进制      字符A
0100 0001 ---> 65 -----> 'A' 

五、ISO-8859-1

ISO(International Standards Organization)国际标准化组织。

ISO-8859-1 是 ISO 发布的第一个 8 位字符集标准,包含 256 个字符,其中前 128 个字符与 ASCII 相同。

  • 0-127:与 ASCII 完全相同,包含基本的英文字母、数字和控制字符。
  • 128-255:包括一些常用的拉丁字母、符号和一些特殊字符,适合大多数西欧语言,如德语、法语、西班牙语等。

六、GB

由于 ASCII 字符集 不支持中文,因此,汉字编码字符集 GB(国标)应运而生。

  • GB2312:前 128 个字符与 ASCII 相同,用两个字节表示汉字(包含约 7,000 个汉字和符号)
  • GBK:GB2312的升级版,包括了GB2312的所有内容,同时新增了近20000个新的汉字,包括繁体字和符号。
  • GB18030:GBK的升级版,包含了大部分的中文(简体、繁体、甲骨文、象形文等等),还有少数民族的文字,识别更多。

其中 GBK 是最常用的。

七、Unicode

1、概述

如果每个国家都定义一套自己的编码标准,结果相互之间谁也不懂谁的编码,就无法进行很好的沟通交流。

所以 ISO(国际标准化组织)定义一套编码方案来解决所有国家的编码问题,这个新的编码方案就叫做 Unicode。

Unicode字符集包含了几乎所有的已知语言的字符,包括各种字母、数字、标点符号、符号、控制字符、中文等。

2、发展

Unicode 字符集 与 ASCII 字符集 的不同之处在于,它使用了更多的位数来表示字符,以便支持更大的字符集。

  • 最早的版本使用16位(两个字节)来表示字符,称为 UCS-2 编码。
  • 后来随着扩展,采用了更多的位数,使用32位(四个字节)来表示字符,称为 UTF-32 编码。
  • 实际应用中,为了节省存储空间,常常使用可变长度的编码方案,例如 UTF-8 和 UTF-16 编码。

3、UTF-8 编码

可变长度编码,使用1~4个字节为每个字符编码

  • 1个字节:ASCII 字符(0-127)
  • 2个字节:拉丁文等字符
  • 3个字节:中文等字符
  • 4个字节:其他极少使用的Unicode辅助字符

4、UTF-16 编码

可变长度编码,通常使用 2 或 4 个字节表示一个字符。

优点

  • 对于许多常用的非英语字符(如汉字),占用的空间相对较小(通常为 2 字节)。
  • 处理时,某些操作可能更高效,因为字符通常是固定长度的(2 或 4 字节)。

缺点

  • 不兼容 ASCII,某些情况下可能需要额外处理。
  • 对于只使用 ASCII 字符的文本,可能会占用更多空间。

八、Base64 编码

1、概述

Base64 编码 是一种将 二进制数据 转换为 ASCII字符串 的编码方式(编码后的一组字符只包含 ASCII 可打印字符)

  • 通常用于在网络传输中以文本形式传输二进制数据,或者用于在文本协议中嵌入二进制数据。
  • 通常是由64个字符组成,包括26个大写字母、26个小写字母、10个数字以及一些特殊字符(+、/、= 等)

2、原理

  1. 输入:Base64 编码的输入是二进制数据,例如 文件内容 或 图像。
  2. 分组:将输入的二进制数据每 3 个字节(24 位)作为一组进行处理。
  3. 拆分:将 24 位的数据拆分为 4 个 6 位的部分。
  4. 映射:根据这 6 位的值在 Base64字符表 中查找对应的字符。
  5. 填充:如果输入的字节数不是 3 的倍数,会在输出末尾添加一个或两个 = 字符作为填充。

Base64 字符表如下(对应 6 位二进制)

ABCDEFGHIJKLMNOPQRSTUVWXYZ (0-25)
abcdefghijklmnopqrstuvwxyz (26-51)
0123456789 (52-61)
+ (62)
/ (63)

3、代码示例

import java.util.Base64;

public class Base64Example {
    public static void main(String[] args) {
        String originalString = "Hello, Base64!";
        String encodedString = Base64.getEncoder().encodeToString(originalString.getBytes());
        String decodedString = new String(Base64.getDecoder().decode(encodedString));

        System.out.println("Original: " + originalString);
        System.out.println("Encoded: " + encodedString);
        System.out.println("Decoded: " + decodedString);
    }
}

九、十六进制编码

Base64编码、AES加密的密文会经常出现/, 跟url里分隔用的/相同,可能会引起一些其它问题。

使用十六进制编码,密文只会存在数字和字母。

public class HexExample {
    public static void main(String[] args) {
        String originalString = "Hello, Hex!";
        String hexString = toHex(originalString.getBytes());
        byte[] bytes = fromHex(hexString);

        System.out.println("Original: " + originalString);
        System.out.println("Hex: " + hexString);
        System.out.println("Decoded: " + new String(bytes));
    }

    public static String toHex(byte[] bytes) {
        StringBuilder hexString = new StringBuilder();
        for (byte b : bytes) {
            String hex = Integer.toHexString(0xff & b);
            if (hex.length() == 1) hexString.append('0');
            hexString.append(hex);
        }
        return hexString.toString();
    }

    public static byte[] fromHex(String hex) {
        int len = hex.length();
        byte[] data = new byte[len / 2];
        for (int i = 0; i < len; i += 2) {
            data[i / 2] = (byte) ((Character.digit(hex.charAt(i), 16) << 4)
                                 + Character.digit(hex.charAt(i + 1), 16));
        }
        return data;
    }
}

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

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

相关文章

kali下编译AOSP报错(libncurses.so.5: cannot open shared object file)

编译报错信息&#xff1a;libncurses.so.5: cannot open shared object file: No such file or directory /bin/bash -c "PWD/proc/self/cwd prebuilts/clang/host/linux-x86/clang-3289846/bin/clang -Ifr ameworks/rs/script_api/include -Iexternal/clang/lib/Headers …

【AI知识点】小世界网络(Small-World Networks)

小世界网络&#xff08;Small-World Networks&#xff09; 是一种具有独特拓扑结构的网络模型&#xff0c;广泛应用于研究社交网络、神经网络、互联网以及其他复杂系统中的节点间连接方式。小世界网络的特点是节点之间的平均路径长度较短&#xff0c;并且大多数节点的局部连接较…

世邦通信股份有限公司IP网络对讲广播系统RCE

漏洞描述 SPON世邦IP网络广播系统采用的IPAudio™技术, 将音频信号以数据包形式在局域网和广域网上进行传送&#xff0c;是一套纯数字传输的双向音频扩声系统。传统广播系统存在的音质不佳&#xff0c;传输距离有限&#xff0c;缺乏互动等问题。该系统设备使用简便&#xff0c…

知识图谱入门——7:阶段案例:使用 Protégé、Jupyter Notebook 中的 spaCy 和 Neo4j Desktop 搭建知识图谱

在 Windows 环境中结合使用 Protg、Jupyter Notebook 中的 spaCy 和 Neo4j Desktop&#xff0c;可以高效地实现从自然语言处理&#xff08;NLP&#xff09;到知识图谱构建的全过程。本案例将详细论述环境配置、步骤实现以及一些扩展和不足之处。 文章目录 1. 环境准备1.1 Neo4j…

webGL入门(六)图形旋转

效果&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</…

PIDM—— 物理正则化扩散模型

概述 论文地址&#xff1a;https://arxiv.org/pdf/2403.14404 源码地址&#xff1a;https://github.com/jhbastek/physicsinformeddiffusionmodels 扩散模型在逼近非常复杂的数据分布方面具有极高的性能和多功能性&#xff0c;近年来在自然科学领域的应用迅速扩展。鉴于其在科…

两数相除111

1.//给你两个整数&#xff0c;被除数 dividend 和除数 divisor。将两数相除&#xff0c;要求 不使用 乘法、除法和取余运算。 //整数除法应该向零截断&#xff0c;也就是截去&#xff08;truncate&#xff09;其小数部分。 // 例如&#xff0c;8.345 将被截断为 8 &#xff0…

基于SSM框架和Layui的学院课程安排系统的设计与实现(源码+定制+定制)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

WDG看门狗在stm32中的应用

一&#xff0c;WDG看门狗的介绍 看门狗可以监控程序的运行状态&#xff0c;当程序因为设计漏洞、硬件故障、电磁干扰等原因&#xff0c;出现卡死或跑飞现象时&#xff0c;看门狗能及时复位程序&#xff0c;避免程序陷入长时间的罢工状态&#xff0c;保证系统的可靠性和安全性看…

2款.NET开源且免费的Git可视化管理工具

Git是什么&#xff1f; Git是一种分布式版本控制系统&#xff0c;它可以记录文件的修改历史和版本变化&#xff0c;并可以支持多人协同开发。Git最初是由Linux开发者Linus Torvalds创建的&#xff0c;它具有高效、灵活、稳定等优点&#xff0c;如今已成为软件开发领域中最流行…

深入理解Dubbo源码核心原理-Part1

启动类&#xff1a; 进入EnableDubbo查看&#xff1a; ①EnableDubboConfig&#xff1a; ②DubboComponentScan&#xff1a; 请看核心方法registerServiceBeans() 到这里&#xff0c;Dubbo对于Bean的加载初始化就做完了&#xff0c;Spring容器读取这些BeanDefinition就要对其进…

【计算机体系结构】TLB和Cache

TLB的设计 在两级页表的虚拟存储系统中&#xff0c;需要访问两次物理内存才能得到虚拟地址所对应的物理地址&#xff0c;而物理内存的访问速度是远远慢于处理器的&#xff0c;为了对该过程进行加速&#xff0c;可以加入一个页表的缓存&#xff0c;该缓存将页表中最近使用的PTE…

<<迷雾>> 第7章 会变魔术的触发器(1)--连着两个按键开关的逻辑电路 示例电路

info::操作说明 鼠标单击开关切换开合状态 A 能使灯点亮并保持; B 则点亮的灯熄灭. 注: 此处使用的是 按钮开关, 松开鼠标后开关会自己断开, 类似于手机和电脑上的电源按钮 因系统原因, 此类开关与普通开关在外观上并无差别. primary::在线交互操作链接 https://cc.xiaogd.net/…

房屋水电费记账本:内置的数组数据击按钮不能删除,页面手动添加的可以删除

<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>房租水电费记录</title><script type&qu…

6 个 Java 工具,轻松分析定位 JVM 问题

使用 JDK 自带工具查看 JVM 情况 JDK 自带了很多命令行甚至是图形界面工具&#xff0c;帮助查看 JVM 的一些信息。比如&#xff0c;在机器上运行 ls 命令&#xff0c;可以看到 JDK 8 提供了非常多的工具或程序&#xff1a; 接下来介绍些常用的监控工具。也可以先通过下面这张图…

buuctf[安洵杯 2019]easy misc1

解压的一个文件夹和图片一个&#xff0c;zip压缩包有密码 FLAG IN ((√2524921X8552)15-1794)NNULLULL, ((√2524921X8552)15-1794)7 我用passware kit 2022 所以试试7数字NNULLULL,掩码&#xff08;mask&#xff09;攻击试试 mask &#xff1a;?d?d?d?d?d?d?dNNULLU…

基于SSM的Java在线音乐平台

文未可获取一份本项目的java源码和数据库参考。 Java在线音乐平台是基于Java Web&#xff0c;依据Java语言功能性强大和简单易用的两大特点&#xff0c;实现的一个网上音乐平台。该平台包含了前台功能&#xff08;用户层面&#xff09;以及后台管理系统&#xff08;管理员层面&…

报刊订阅系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;报刊类型管理&#xff0c;报刊信息管理&#xff0c;报刊订阅管理&#xff0c;订阅发送管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;报刊信息&a…

vector 的使用(上)

1.概念 vector本质是顺序表。它像数组一样&#xff0c;用一块连续的空间对数据进行管理&#xff0c;但又区别于数组&#xff0c;它的空间是根据数据进行动态增容的&#xff0c;并封装了一系列成员变量对数据进行监控&#xff0c;封装成员函数对数据进行操作。 2.区别 vector…