加密与安全_探索常用编码算法

文章目录

  • 概述
  • 什么是编码
  • 编码分类
    • ASCII码 (最多只能有128个字符)
      • Code: 字符转换成ascii码
      • ASCII码对照表
    • Unicode (用于表示世界上几乎所有的文字和符号)
    • URL编码 (解决服务器只能识别ASCII字符的问题)
      • 实现:编码_URLEncoder
      • 实现: 解码_URLDecoder
      • 小结
    • Base64编码
      • 实现:编码_Base64.getEncoder()
      • 实现:解码_Base64.getDecoder
      • byte[]数组长度不是3的整数倍
      • Base64.getUrlEncoder()
      • 小结
  • 总结

在这里插入图片描述


概述

在计算机系统中,加密与安全是至关重要的概念。

想象一下,当B想要发送一封邮件给A时,邮件可能在传送过程中遭到黑客的窃听,这就需要防止信息泄露。此外,黑客还可能篡改邮件内容,因此A需要确保她能够辨别出邮件是否被篡改。最后,黑客可能会冒充B发送虚假邮件给A,这需要A有能力辨别真伪

为了应对这些潜在的安全威胁,我们需要采取以下三项措施:

  1. 防止窃听
  2. 防止篡改
  3. 防止伪造

计算机加密技术旨在实现上述目标。现代计算机密码学建立在严格的数学理论基础上,并逐渐发展成为一门科学。对于大多数开发者来说,设计安全的加密算法是一项艰巨的任务,验证加密算法的安全性则更加困难。目前认为安全的加密算法也只是尚未被攻破。因此,为了编写安全的计算机程序,我们应遵循以下原则:

  1. 不要设计自己的加密算法
  2. 不要自行实现已有的加密算法
  3. 不要修改已有的加密算法

接下来,我们将一起探讨最常用的加密算法,以及Java实现。


什么是编码

编码是一种将符号、文字或其他数据转换为特定格式或标准的过程。

编码是计算机科学中的一个重要概念,它指的是将符号、文字或其他数据转换为特定格式或标准的过程。这种转换是为了方便存储、传输和处理数据。编码可以涵盖多种形式,包括数字编码、字符编码、图像编码、音频编码等。

数字编码是将数字转换为计算机可以理解的二进制形式的过程,通常涉及将十进制数字转换为二进制或其他进制的表示形式。

字符编码是将字符映射到数字或比特序列的过程,以便计算机能够处理和存储文本数据。常见的字符编码包括ASCII(美国信息交换标准代码)、Unicode等。

图像编码是将图像数据转换为计算机可识别的格式的过程,常见的图像编码包括JPEG、PNG、GIF等。

音频编码是将声音数据转换为数字形式的过程,以便计算机可以处理和存储音频数据。常见的音频编码包括MP3、AAC、WAV等。

通过编码,我们能够将各种类型的数据转换为计算机可以处理的形式,从而实现数据的存储、传输和处理。

在这里插入图片描述


编码分类

ASCII码 (最多只能有128个字符)

ASCII码(American Standard Code for Information Interchange,美国信息交换标准代码) 就是一种常见的字符编码标准。在ASCII码中,每个字符都被赋予一个唯一的数值表示,通常是一个字节(8位)。

例如,字母’A’的ASCII编码是十六进制的0x41,字母’B’是0x42,字母’C’是0x43,以此类推。ASCII码包含了标准的英文字母、数字、标点符号以及一些控制字符的编码,共计128个字符。

下面是一些常见字符的ASCII编码示例:

字符ASCII编码
A0x41
B0x42
C0x43
D0x44

字母’A’的ASCII编码为0x41,这是因为ASCII编码是一种固定长度的字符编码标准,用一个字节(8位)表示一个字符。在ASCII编码中,大写字母’A’的编码是65,换算成十六进制就是0x41。

ASCII编码是根据英语字母表中的顺序进行编码的,因此大写字母’A’在ASCII编码中是排在字母表的第一个位置,其对应的十进制数值为65,换算成十六进制即为0x41。


Code: 字符转换成ascii码

  public static void main(String[] args) {
        char a = 'a';
        int b = a;
        // 打印b,在ascii当中十进制的数字对应是多少
        System.out.println(b);

        // 定义字符串
        String aaZ = "Artisan";
        // 需要拆开字符串
        char[] chars = aaZ.toCharArray();
        for (char aChar : chars) {
            int asciicode = aChar;
            System.out.println(asciicode);
        }
    }

在这里插入图片描述


ASCII码对照表

在这里插入图片描述

ASCII码对照表

二进制十进制十六进制字符/缩写解释
00000000000NUL (NULL)空字符
00000001101SOH标题开始
00000010202STX正文开始
00000011303ETX正文结束
00000100404EOT传输结束
00000101505ENQ请求
00000110606ACK回应/响应/收到通知
00000111707BEL响铃
00001000808BS退格
00001001909HT水平制表符
00001010100ALF/NL换行键
00001011110BVT垂直制表符
00001100120CFF/NP换页键
00001101130DCR回车键
00001110140ESO不用切换
00001111150FSI启用切换
000100001610DLE数据链路转义
000100011711DC1/XON设备控制1/传输开始
000100101812DC2设备控制2
000100111913DC3/XOFF设备控制3/传输中断
000101002014DC4设备控制4
000101012115NAK无响应/非正常响应/拒绝接收
000101102216SYN同步空闲
000101112317ETB传输块结束/块传输终止
000110002418CAN取消
000110012519EM已到介质末端/介质存储已满/介质中断
00011010261ASUB替补/替换
00011011271BESC逃离/取消
00011100281CFS文件分割符
00011101291DGS组分隔符/分组符
00011110301ERS记录分离符
00011111311FUS单元分隔符
001000003220(Space)空格
001000013321!
001000103422"
001000113523#
001001003624$
001001013725%
001001103826&
001001113927
001010004028(
001010014129)
00101010422A*
00101011432B+
00101100442C,
00101101452D-
00101110462E.
00101111472F/
0011000048300
0011000149311
0011001050322
0011001151333
0011010052344
0011010153355
0011011054366
0011011155377
0011100056388
0011100157399
00111010583A:
00111011593B;
00111100603C<
00111101613D=
00111110623E>
00111111633F?
010000006440@
010000016541A
010000106642B
010000116743C
010001006844D
010001016945E
010001107046F
010001117147G
010010007248H
010010017349I
01001010744AJ
01001011754BK
01001100764CL
01001101774DM
01001110784EN
01001111794FO
010100008050P
010100018151Q
010100108252R
010100118353S
010101008454T
010101018555U
010101108656V
010101118757W
010110008858X
010110018959Y
01011010905AZ
01011011915B[
01011100925C\
01011101935D]
01011110945E^
01011111955F_
011000009660`
011000019761a
011000109862b
011000119963c
0110010010064d
0110010110165e
0110011010266f
0110011110367g
0110100010468h
0110100110569i
011010101066Aj
011010111076Bk
011011001086Cl
011011011096Dm
011011101106En
011011111116Fo
0111000011270p
0111000111371q
0111001011472r
0111001111573s
0111010011674t
0111010111775u
0111011011876v
0111011111977w
0111100012078x
0111100112179y
011110101227Az
011110111237B{
011111001247C|
011111011257D}
011111101267E~
011111111277FDEL删除

Unicode (用于表示世界上几乎所有的文字和符号)

Unicode是一种广泛使用的字符编码标准,用于表示世界上几乎所有的文字和符号相比于ASCII编码的128个字符,Unicode可以表示更多的字符,包括中文、日文、阿拉伯文等。

中文的Unicode编码示例如下:

汉字Unicode编码UTF-8编码
0x4e2d0xe4b8ad
0x65870xe69687
0x7f160xe7bc96
0x78010xe7a081

另外,UTF-8是一种变长编码,用于将Unicode字符编码成字节序列。对于英文字符,UTF-8使用一个字节表示,而对于中文等Unicode字符,则需要多个字节来表示。例如,汉字’中’的UTF-8编码是0xe4b8ad,它需要3个字节来表示

UTF-8编码的复杂性在于它是一种不定长编码,字符的编码长度取决于Unicode编码的范围。但是,通过给定字符的Unicode编码,可以推算出它在UTF-8编码中所占用的字节数。


URL编码 (解决服务器只能识别ASCII字符的问题)

URL编码是一种用于在URL中传输数据时使用的编码方式。它通常被用于对URL的参数部分进行编码,以确保传输的数据符合URL的规范。举例来说:

如果我们想在URL中传输非ASCII字符,比如中文或日文等,由于许多服务器只能识别ASCII字符,因此我们需要对这些非ASCII字符进行编码。URL编码就是为了解决这个问题而设计的

URL编码的规则如下:

  • 对于A~Z、a~z、0~9以及-、_、.、*这些字符,保持不变;
  • 对于其他字符,首先转换为其对应的UTF-8编码,然后将每个字节表示为%XX的形式。
  • URL编码总是使用大写字母表示

举例来说,如果字符中的UTF-8编码是0xe4b8ad,那么它的URL编码就是%E4%B8%AD

举个例子

https://www.artisan.com/s?wd=%E4%B8%AD%E6%96%87

在这里插入图片描述
其实就是 https://www.artisan.com/s?wd=中文

实现:编码_URLEncoder

package com.artisan.securityalgjava.urlencode;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;

/**
 * @author 小工匠
 * @version 1.0
 * @mark: show me the code , change the world
 */
public class UrlEncoderTest {

    public static void main(String[] args) throws UnsupportedEncodingException {
        // 编码
        String result = URLEncoder.encode("中文!", StandardCharsets.UTF_8.toString());
        System.out.println(result);
 
    }
}
    

在这里插入图片描述

的URL编码是%E4%B8%AD的URL编码是%E6%96%87!虽然是ASCII字符,也要对其编码为%21

和标准的URL编码稍有不同,URLEncoder把空格字符编码成+,而现在的URL编码标准要求空格被编码为%20, 服务器都可以处理这两种情况


实现: 解码_URLDecoder

URL编码的字符串对其进行解码还原成原始字符串

// 解码
String decode = URLDecoder.decode("%E4%B8%AD%E6%96%87%21", StandardCharsets.UTF_8.toString());
System.out.println(decode);

在这里插入图片描述

小结

URL编码是编码算法,不是加密算法。URL编码的目的是把任意文本数据编码为%前缀表示的文本,编码后的文本仅包含A~Z,a~z,0~9,-,_,.,*%,便于浏览器和服务器处理。


Base64编码

Base64 编码是一种将二进制数据编码为文本格式的方法,它可以将任意长度的二进制数据转换为纯文本,并且只包含一组特定的字符集,包括 A~Z、a~z、0~9、+、/、=

Base64 编码的原理是将 3 字节的二进制数据按照 6 位一组进行分组,然后将每组 6 位的二进制数转换为对应的整数,再根据整数对应的索引查表,将索引对应的字符拼接起来,得到编码后的字符串。

具体步骤如下:

  1. 将原始二进制数据每 3 个字节分为一组。
  2. 将每组 3 个字节转换为 4 个 6 位的二进制数。
  3. 将每个 6 位的二进制数转换为对应的整数。
  4. 将每个整数使用查表的方式映射到对应的字符集合中的字符。
  5. 将得到的字符拼接成一个字符串作为 Base64 编码结果。

由于 Base64 编码的特性,它常用于在网络上传输数据,例如在电子邮件中传输二进制文件或在网页中嵌入图片等。由于其将二进制数据编码为文本的特点,使得它可以直接作为文本传输,而无需担心编码后的数据会包含特殊字符或控制字符。

举个例子:3个byte数据分别是e4、b8、ad,按 6 bit分组得到39、0b、22、2d

在这里插入图片描述

6位整数的范围总是0~63,所以,能用64个字符表示:字符A~Z对应索引0~25,字符a~z对应索引26~51,字符0~9对应索引52~61,最后两个索引62、63分别用字符+/表示


实现:编码_Base64.getEncoder()

package com.artisan.securityalgjava.base64;


import java.util.Arrays;
import java.util.Base64;

/**
 * @author 小工匠
 * @version 1.0
 * @mark: show me the code , change the world
 */
public class Base64Test {

    public static void main(String[] args) {
        // 创建一个包含中文字符 "中" 的字节数组
        byte[] bytes = {(byte) 0xe4, (byte) 0xb8, (byte) 0xad};

        // 使用 Base64 编码器将字节数组转换为 Base64 字符串
        String result = Base64.getEncoder().encodeToString(bytes);
        System.out.println(result);
 

    }
}
    

在这里插入图片描述


实现:解码_Base64.getDecoder

package com.artisan.securityalgjava.base64;


import java.util.Arrays;
import java.util.Base64;

/**
 * @author 小工匠
 * @version 1.0
 * @mark: show me the code , change the world
 */
public class Base64Test {

    public static void main(String[] args) {
        // 创建一个包含中文字符 "中" 的字节数组
        byte[] bytes = {(byte) 0xe4, (byte) 0xb8, (byte) 0xad};

        // 使用 Base64 编码器将字节数组转换为 Base64 字符串
        String result = Base64.getEncoder().encodeToString(bytes);
        System.out.println(result);

        // 使用 Base64 解码器将 Base64 字符串解码为字节数组
        byte[] decode = Base64.getDecoder().decode(result);
        System.out.println(Arrays.toString(decode));
    }
}

    

将包含中文字符 “中” 的字节数组进行 Base64 编码,然后再解码回原始字节数组,并打印结果。


byte[]数组长度不是3的整数倍

如果输入的byte[]数组长度不是3的整数倍真么办?这种情况下,需要对输入的末尾补一个或两个0x00,编码后,在结尾加一个=表示补充了1个0x00,加两个=表示补充了2个0x00,解码的时候,去掉末尾补充的一个或两个0x00即可

实际上,因为编码后的长度加上=总是4的倍数,所以即使不加=也可以计算出原始输入的byte[]

看代码

import java.util.Arrays;
import java.util.Base64;

public class Base64Test {

    // 定义一个静态方法用于测试 Base64 编码和解码
    static void testCase() {
        // 输入的字节数组,包含一个中文字符和一个 ASCII 字符
        byte[] input = new byte[] { (byte) 0xe4, (byte) 0xb8, (byte) 0xad, 0x21 };

        // 使用 Base64 编码器将字节数组转换为 Base64 字符串
        String b64encoded = Base64.getEncoder().encodeToString(input);

        // 使用 Base64 编码器进行无填充的 Base64 编码
        String b64encoded2 = Base64.getEncoder().withoutPadding().encodeToString(input);

        // 打印两种编码结果
        System.out.println("Base64 编码结果1: " + b64encoded);
        System.out.println("Base64 编码结果2: " + b64encoded2);

        // 使用 Base64 解码器将 Base64 字符串解码为字节数组
        byte[] output = Base64.getDecoder().decode(b64encoded2);

        // 打印解码后的字节数组
        System.out.println("解码后的字节数组: " + Arrays.toString(output));
    }

    public static void main(String[] args) {
        // 调用测试方法
        testCase();
    }
}

在这里插入图片描述


Base64.getUrlEncoder()

标准的 Base64 编码在某些场景下不适合在 URL 中使用,因为它会包含字符 +/=,而这些字符在 URL 中可能会引起解析错误或歧义。

为了解决这个问题,可以使用一种针对 URL 的 Base64 编码,它对标准的 Base64 编码做了简单的修改,即将 + 替换为 -,将 / 替换为 _,从而避免了在 URL 中可能引起问题的字符。

这种修改后的 Base64 编码仍然可以通过标准的 Base64 解码器进行解码,因为这两种编码方式只是字符替换的差异,不影响原始数据的编码规则和解码逻辑。

static void urlEncoder() {
    // 创建一个字节数组作为输入数据
    byte[] input = new byte[]{0x01, 0x02, 0x7f, 0x00};

    // 使用 URL 安全的 Base64 编码器将字节数组转换为 Base64 字符串
    String result = Base64.getUrlEncoder().encodeToString(input);
    System.out.println("URL 编码结果: " + result);

    // 使用 URL 安全的 Base64 解码器将 Base64 字符串解码为字节数组
    byte[] decode = Base64.getUrlDecoder().decode(result);
    System.out.println("解码后的字节数组: " + Arrays.toString(decode));
}

演示了如何使用 URL 安全的 Base64 编码器将字节数组进行编码,以及如何使用相应的解码器将编码后的 Base64 字符串解码回原始的字节数组。URL 安全的 Base64 编码会将 + 替换为 -,将 / 替换为 _,以避免在 URL 中可能引起问题的字符。

0x01, 0x02, 0x7f, 0x00 是十六进制表示法,表示了四个字节的值。在 Java 中,0x 前缀表示后面的数字是十六进制数。

  • 0x01 表示十进制数值为 1
  • 0x02 表示十进制数值为 2
  • 0x7f 表示十进制数值为 127
  • 0x00 表示十进制数值为 0

因此,input 这个字节数组包含了四个字节,分别是 1、2、127 和 0。

在这里插入图片描述


小结

Base64 编码是一种常用的将二进制数据转换为文本数据的方法,适用于需要在文本环境中传输二进制数据的场景,比如电子邮件、XML 数据传输等。

然而, Base64 编码会将原始数据的长度增加约 1/3,这会降低传输效率。因此,在一些对传输效率要求较高的场景下,可能会选择其他更高效的编码方式,比如 Base32、Base48 或 Base58 编码。这些编码方式可以根据实际需求选择字符集合的大小,以权衡编码效率和字符集合大小之间的关系。不过,无论是哪种编码方式,它们都是一种编码算法,而不是加密算法,因为它们不会对数据进行加密,只是将数据转换成不同的形式。


总结

  • URL 编码是一种编码算法,其目的是将任意文本数据编码为 % 前缀表示的文本形式,以便在网络中传输,特别是用于浏览器和服务器之间的通信,以处理一些特殊字符或者非 ASCII 字符。

  • Base64 编码同样是一种编码算法,它将任意二进制数据编码为文本形式,方便在文本环境中传输,但编码后的数据量会增加原始数据的约 1/3。这种编码在很多场景中使用,比如电子邮件、XML 数据传输等,以便在文本协议中传输二进制数据。

虽然它们都是编码算法而不是加密算法,但它们在不同的场景中有着不同的用途和目的。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】复杂度详解

目录 &#xff08;一&#xff09;算法的复杂度 &#xff08;二&#xff09;时间复杂度 &#xff08;1&#xff09;练笔解释&#xff1a; i&#xff0c;示例1 ii&#xff0c;示例2 iii&#xff0c;二分查找 iv&#xff0c;斐波那契 &#xff08;三&#xff09;空间复杂度…

带使能控制的锂电池充放电解决方案

一、产品概述 TP4594R 是一款集成线性充电管理、同步升压转换、电池电量指示和多种保护功能的单芯片电源管理 SOC&#xff0c;为锂电池的充放电提供完整的单芯片电源解决方案。 TP4594R 内部集成了线性充电管理模块、同步升压放电管理模块、电量检测与 LED 指示模块、保护模块…

企业指标体系建设与管理:运用MECE原则与战略地图,打造完美闭环

在数字化时代&#xff0c;数据已经成为企业的核心资产。为了更好地利用这些数据&#xff0c;企业需要建立一套科学、完整、高效的指标体系。而在这个过程中&#xff0c;MECE原则&#xff08;Mutually Exclusive, Collectively Exhaustive&#xff0c;即“相互独立&#xff0c;完…

day04-Maven-SpringBootWeb入门

文章目录 01. Maven1.1 课程安排1.2 什么是Maven1.3 Maven的作用1.4 Maven模型1.5 Maven仓库1.6 Maven安装1.6.1 下载1.6.2 安装步骤 2 IDEA集成Maven2.1 配置Maven环境2.1.1 当前工程设置2.1.2 全局设置 2.2 创建Maven项目2.3 POM配置详解2.4 Maven坐标详解2.5 导入Maven项目 …

探索Ubuntu命令行:常见问题与解决方案

一、引言 Ubuntu&#xff0c;作为一款流行的Linux发行版&#xff0c;其命令行界面&#xff08;CLI&#xff09;为用户提供了丰富的功能和灵活性。然而&#xff0c;对于新手来说&#xff0c;命令行可能会带来一些挑战。本文将探讨一些在使用Ubuntu命令行时可能遇到的问题及其解决…

#QT(DEMO)

1.IDE&#xff1a;QTCreator 2.实验&#xff1a;打印"hello wolrd" 3.记录 &#xff08;1&#xff09;创建一个新工程&#xff1a; 新建好一个工程存放文件夹&#xff08;路径不能有中文&#xff09;,然后按下图配置 &#xff08;2&#xff09;点击widgets.ui拖入以…

数学建模【多元线性回归模型】

一、多元线性回归模型简介 回归分析是数据分析中最基础也是最重要的分析工具&#xff0c;绝大多数的数据分析问题&#xff0c;都可以使用回归的思想来解决。回归分析的任务就是&#xff0c;通过研究自变量X和因变量Y的相关关系&#xff0c;尝试去解释Y的形成机制&#xff0c;进…

一篇了解电阻的使用

目录 一、电阻理论基础 1.电阻的定义 2.欧姆定律 3.电阻决定式 4.电阻的串并联​编辑 5.电阻的功率 6.温度对电阻的影响 二、电阻的选型 1.安装方式 2.电阻值 &#xff08;1&#xff09;电阻值的标称 &#xff08;2&#xff09;电阻值的确定 &#xff08;3&#x…

图片上的物品怎么抠出来?这三种方法教你快速消除

怎么把图片上的物品抠出来&#xff1f;这是一个在设计、摄影和后期制作中经常遇到的问题。在很多设计项目中&#xff0c;我们可能需要从一张图片中扣出某个物品&#xff0c;以便在其他背景中使用&#xff0c;或者将其与其他图像组合在一起。今天&#xff0c;我们就来分享三种常…

力扣刷题记录--463. 岛屿的周长

题目链接&#xff1a;463. 岛屿的周长 - 力扣&#xff08;LeetCode&#xff09; 题目描述 我的代码实现 class Solution {public int islandPerimeter(int[][] grid) { int result0; int rowgrid.length; int colgrid[0].length; for(int i0;i<row;i){for(int j0;j<col…

FPGA时序约束与分析--数据到达路径和数据需求路径

文章目录 前言一、定义二、时序模型三、公式推导前言 时序约束的定义–设计者根据实际的系统功能,通过时序约束的方式提出时序要求; FPGA 编译工具根据设计者的时序要求,进行布局布线;编译完成后, FPGA 编译工具还需要针对布局布线的结果,套用特定的时序模型( FPGA 器件…

Git 初试 安装

Git初识 遇到问题&#xff1a; 在生活和学习中&#xff0c;我们会遇到这样的问题&#xff0c;比如上交论文的时候&#xff0c;老师让你改了一遍又一遍&#xff0c;结果改到最后一版的时候&#xff0c;说你这个还不如你第一版的或者前几版的&#xff0c;老师又说&#xff0c;把…

美女街拍3000张高清图

美女街拍3000张高清图&#xff0c;需要的可以直接下载 2.资源下载 ​途径一&#xff1a;点击以下链接直接下载 美女街拍3000张高清图 途径二&#xff1a;直接长按住以下图片识别进去下载即可

揭秘App访问量背后的秘密:数据统计与分析

在移动互联网时代&#xff0c;App已成为人们日常生活的重要组成部分。对于App运营者来说&#xff0c;了解用户的访问量、行为习惯等数据至关重要。本文将深入探讨如何精准统计App访问量&#xff0c;为运营者提供有价值的数据支持。 一、App访问量统计的重要性 访问量是衡量A…

jmeter 二次开发详解

背景&#xff1a; JMeter 是一个功能强大的性能测试工具&#xff0c;但它可能无法满足特定项目或组织的特定需求。通过进行二次开发&#xff0c;可以定制 JMeter&#xff0c;使其适应具体项目的需求。例如&#xff0c;可能需要添加自定义的 测试元件、报告生成器或结果分析器…

Springboot+vue的船舶监造系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的船舶监造系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的船舶监造系统&#xff0c;采用M&#xff08;model&#xff09;V&#xff…

温湿度传感器SHT21

SHT21是一款基于IIC的温湿度传感器&#xff0c;它的引脚及定义如下&#xff1a; 标准的IIC器件&#xff0c;没有其他多余的引脚&#xff0c;应用框图如下&#xff1a; 温度的测量范围是-40到125℃&#xff0c;湿度测量范围0-100%RH&#xff0c;具体参数及采样精度见下图&#x…

鸿蒙ArkTs开发问题总结

版本问题 现阶段鸿蒙ArkTs开发主要分为两个版本 HarmonyOS3.x.x(API9)及HarmonyOS4.x.x(API10) 一下简称为 API9,API10 官方现在所有案例均以 HarmonyOS4.x.x(API10) 为基础请注意选择分支 API9&HarmonyOS3.x.x 鸿蒙开发编译器默认下载的为public版本SDK不是全量SDK需要…

【Linux】输入系统应用

# 前置知识 (1)输入子系统分为三层&#xff0c;分别是事件处理层、核心层、设备驱动层&#xff1b; (2)鼠标移动、键盘按键按下等输入事件都需要通过设备驱动层→核心层→事件处理层→用户空间&#xff0c;层层上报&#xff0c;直到应用程序; 事件处理层 (1)事情处理层主要是负…

Windows10蓝牙开关按钮不见了问题??

Windows10蓝牙开关按钮不见了问题&#xff1f;&#xff1f;此类问题一般是系统更新不及时的bug&#xff0c;遗漏掉了蓝牙相关驱动插件 试过很多方法&#xff0c;直接下载一个驱动人生即可&#xff0c;主要通过官网下载 下载这个就行 打开软件自动扫描就可以了 最后查看结果