当前位置: 首页 > news >正文

《Python加解密小实验:探索数据加密与解密的世界》

铺垫(1)-源码

import hashlib
source = "你好"
# print(hashlib.md5(source.encode()).hexdigest())# 文件加解密
with open('../文件引用/index.png', 'rb') as file:data = file.read()
# print(hashlib.md5(data).hexdigest())# SHA也是摘要算法
# print(hashlib.sha256(source.encode()).hexdigest())

铺垫(1)-源码解析

这段代码主要演示了如何使用Python的hashlib库来计算字符串和文件的哈希值

代码解析

  1. 导入库:

import hashlib

这行代码导入了Python的hashlib库,该库提供了多种哈希算法,如MD5, SHA1, SHA256等。 2. 字符串哈希:

source = "你好"
# print(hashlib.md5(source.encode()).hexdigest())

这里定义了一个字符串source,其值为"你好"。接下来的注释代码展示了如何计算该字符串的MD5哈希值。

* `source.encode()`: 将字符串转换为字节串,因为`hashlib`的哈希函数需要字节串作为输入。
* `hashlib.md5(...)`: 创建一个MD5哈希对象。
* `.hexdigest()`: 计算哈希值并返回其十六进制表示。
  1. 文件哈希:

with open('../文件引用/index.png', 'rb') as file:data = file.read()
# print(hashlib.md5(data).hexdigest())

这部分代码打开了一个名为index.png的文件,并读取了其内容到变量data中。接下来的注释代码展示了如何计算该文件内容的MD5哈希值。

* `'rb'`: 以二进制模式打开文件,确保文件内容被正确读取。
  1. SHA256哈希:

# SHA也是摘要算法
# print(hashlib.sha256(source.encode()).hexdigest())

这部分代码展示了如何使用SHA256算法计算字符串"你好"的哈希值。与MD5类似,但SHA256提供了更高的安全性。

注意事项

  • 哈希算法是单向的,这意味着你不能从哈希值中恢复原始数据。

  • 不同的哈希算法有不同的输出长度和安全性。例如,MD5的输出长度为128位,而SHA256的输出长度为256位。

  • 哈希算法通常用于验证数据的完整性,而不是加密数据。因为哈希算法是单向的,所以它们不适合用于需要解密数据的场景。

总结

这段代码主要演示了如何使用Python的hashlib库来计算字符串和文件的哈希值。哈希算法是单向的,主要用于验证数据的完整性。

铺垫(2)-源码

source = 'DSFASsafdasf42343'  # dsfasSAFDASF53454
result = ''
for i in source:if ord(i) in range(65, 91):temp = chr(ord(i) + 32)elif ord(i) in range(97, 123):temp = chr(ord(i) - 32)elif ord(i) in range(48, 58):temp = chr(ord(i) + 1)# temp = chr(ord()-1)  # 解密算法result += temp
# print(result)

铺垫(2)-源码解析

这段代码的主要目的是对一个字符串source进行简单的加密处理

  1. 初始化:

    • source 是一个给定的字符串,其值为 'DSFASsafdasf42343'。

    • result 是一个空字符串,用于存储加密后的结果。

  2. 遍历字符串: 使用for循环遍历source中的每一个字符i

  3. 条件判断与加密:

    • 如果字符i的ASCII值在65到90之间(即大写字母A-Z),则将其转换为对应的小写字母。这是通过获取字符i的ASCII值,加32(因为小写字母比对应的大写字母的ASCII值大32),然后再转换回字符来实现的。

    • 如果字符i的ASCII值在97到122之间(即小写字母a-z),则将其转换为对应的大写字母。这是通过获取字符i的ASCII值,减32,然后再转换回字符来实现的。

    • 如果字符i的ASCII值在48到57之间(即数字0-9),则将其转换为下一个数字。例如,'9'会变成':'(这不是一个数字,而是一个冒号字符,因为ASCII值57+1=58,对应的字符是':')。这里有一个注释掉的行# temp = chr(ord()-1) # 解密算法,这行代码如果取消注释,会将数字减1而不是加1,从而实现解密。

  4. 拼接结果: 将转换后的字符temp添加到result字符串中。

  5. 输出: 最后,打印加密后的字符串result。但需要注意的是,代码中最后一行print(result)被注释掉了,所以如果直接运行这段代码,不会有任何输出。要看到结果,需要取消这一行的注释。

注意:这段代码并不是一个真正的加密算法,因为它很容易被破解。例如,大写字母总是转换为小写字母,小写字母总是转换为大写字母,数字总是增加1(或减少1)。这种转换模式是固定的,所以很容易通过观察和分析来破解。

如果想要一个真正的加密算法,建议使用像AES、RSA这样的成熟加密算法,这些算法提供了更高的安全性。

铺垫(3)-源码

import stringupper_list = string.ascii_uppercase
lower_list = string.ascii_lowercase# 凯撒加密右移5位
upper_dest = ''
for i in upper_list:index = (upper_list.index(i) + 5) % len(upper_list)print(upper_list[index], end=' ')upper_dest += upper_list[index]
print()
# 凯撒加密右移5位
for i in upper_dest:index = upper_dest.index(i) - 5print(upper_dest[index], end=' ')

铺垫(3)-源码解析

这段代码实现了凯撒加密(Caesar cipher)的一种形式,具体是对英文字母进行右移5位的加密,然后又进行了相应的解密

代码解析

  1. 导入模块:

import string

导入了Python的string模块,该模块包含了一些常用的字符串常量,如所有的ASCII字母。 2. 定义字母列表:

upper_list = string.ascii_uppercase
lower_list = string.ascii_lowercase

upper_list包含了所有的大写英文字母,而lower_list包含了所有的小写英文字母。 3. 凯撒加密右移5位:

upper_dest = ''
for i in upper_list:index = (upper_list.index(i) + 5) % len(upper_list)print(upper_list[index], end=' ')upper_dest += upper_list[index]
print()

这部分代码实现了对大写字母的凯撒加密右移5位:

* 初始化一个空字符串`upper_dest`来存储加密后的结果。
* 遍历`upper_list`中的每一个字符`i`。
* 使用`upper_list.index(i)`找到字符`i`在`upper_list`中的索引位置,然后加5得到新的索引位置。使用模运算`% len(upper_list)`确保索引不会超出列表的范围。
* 使用新的索引位置从`upper_list`中获取加密后的字符,并打印它(后面跟一个空格)。
* 将加密后的字符添加到`upper_dest`字符串中。
* 最后打印一个换行符。
  1. 凯撒解密左移5位: 注意:虽然代码注释说是“凯撒加密右移5位”,但这段代码实际上是进行了解密操作,即左移5位。

for i in upper_dest:index = upper_dest.index(i) - 5print(upper_dest[index], end=' ')

这部分代码实现了对加密后的字符串upper_dest的解密(左移5位):

* 遍历`upper_dest`中的每一个字符`i`。
* 使用`upper_dest.index(i)`找到字符`i`在`upper_dest`中的索引位置,然后减5得到原始字符在`upper_dest`中的索引位置(因为之前加了5位进行加密)。
* 使用这个索引位置从`upper_dest`中获取原始字符,并打印它(后面跟一个空格)。

注意

  1. 这段代码只处理了大写字母。如果要处理小写字母,你需要对lower_list执行类似的操作。

  2. 凯撒加密是一种简单的替换加密方法,它很容易被破解。因此,在实际应用中,不建议使用凯撒加密来保护敏感信息。

  3. 在解密部分,代码假设加密是通过右移5位实现的。如果加密是通过其他方式实现的,解密部分可能不会正常工作。

铺垫(4)-源码

list = []
for i in upper:list.append(i)
# print(list)
list2 = ['F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z','A', 'B', 'C', 'D', 'E']
# 凯撒加密,右位移5
for i in list:index = (list.index(i) + 5) % len(list)# print(list[index], end=' ')
# 凯撒解密,左位移5,python特有下标取负数,不需要取余
for i in list2:index = list.index(i) - 5print(list[index], end=' ')

铺垫(4)-源码解析

这段代码实现了凯撒加密(Caesar cipher)的加密和解密过程

代码解析

  1. 初始化列表:

    • list = []: 创建一个空列表list

    • for i in upper: list.append(i): 这段代码似乎是从一个名为upper的字符串或列表中获取所有字符,并将它们添加到list中。但请注意,upper在这段代码中没有定义,可能是在代码的其他部分定义的。

    • list2: 这是一个包含所有大写字母的列表,但它跳过了'F'到'J'之间的字母,并从'K'开始。这似乎是一个错误,因为通常凯撒加密会处理所有的字母。不过,这段代码可能是为了演示某种特定的移位情况。

  2. 凯撒加密:

    • for i in list: index = (list.index(i) + 5) % len(list): 这段代码遍历list中的每个字符,并计算其在列表中的新位置,新位置是当前位置加5并对列表长度取模。这是凯撒加密的核心思想,即将字母表中的每个字母移动固定的位置数。

    • 注:print(list[index], end=' '): 这行代码被注释掉了,如果取消注释,它会打印加密后的字符。

  3. 凯撒解密:

    • for i in list2: index = list.index(i) - 5: 这段代码遍历list2中的每个字符,并计算其在list中的原始位置,原始位置是当前位置减5。这是凯撒解密的核心思想,即将字母表中的每个字母移动回其原始位置。

    • print(list[index], end=' '): 这行代码打印解密后的字符。

注意事项

  1. upper未定义: 代码中的upper变量没有在这段代码中定义。它可能是在代码的其他部分定义的,或者这是一个遗漏。

  2. list2的错误: list2似乎是一个错误的字母表,因为它跳过了'F'到'J'之间的字母。这可能会导致解密过程出现问题。

  3. 效率问题: 使用list.index(i)来查找字符的位置可能不是最高效的方法,特别是当列表很大时。一个更好的方法是使用字典来存储字符和其位置的映射。

  4. 代码注释: 代码中有一些有用的注释,但也有一些被注释掉的代码。为了更清晰地理解代码,建议删除不必要的注释,并确保所有重要的代码都是可见的。

修改后的代码示例

下面是一个修改后的代码示例,修复了上述提到的一些问题:

# 定义大写字母列表
upper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'# 初始化加密列表和解密列表
encrypted_list = []
decrypted_list = []# 凯撒加密,右位移5
for char in upper:index = (upper.index(char) + 5) % len(upper)encrypted_char = upper[index]encrypted_list.append(encrypted_char)# 打印加密后的列表
print("Encrypted:", ''.join(encrypted_list))# 凯撒解密,左位移5
for char in encrypted_list:index = (upper.index(char) - 5) % len(upper)decrypted_char = upper[index]decrypted_list.append(decrypted_char)# 打印解密后的列表
print("Decrypted:", ''.join(decrypted_list))

这个修改后的代码更清晰、更完整,并且修复了原始代码中的一些问题。

完整实现-源码

import stringupper_list = string.ascii_uppercase
lower_list = string.ascii_lowercasedef encrypt_zhang(source):# 对大小写字母右移6位dest = ''for i in source:# 如果是大写的情况if i in upper_list:index = (upper_list.index(i) + 6) % len(upper_list)dest += upper_list[index]elif i in lower_list:index = (lower_list.index(i) + 6) % len(lower_list)dest += lower_list[index]return dest# 对字母大小写转换(加解密同源)
def convert_li(source):dest = ''for i in source:if ord(i) in range(65, 91):dest += chr(ord(i) + 32)elif ord(i) in range(97, 123):dest += chr(ord(i) - 32)return dest# 对encrypt_zhang解密,大小写左移6位
def decrypt_zhang(source):dest = ''for i in source:if i in upper_list:index = upper_list.index(i) - 6dest += upper_list[index]elif i in lower_list:index = lower_list.index(i) - 6dest += lower_list[index]return destif __name__ == '__main__':result1 = encrypt_zhang('ZHANGsan')print(result1)result2 = convert_li(result1)print(result2)result3 = decrypt_zhang(result2)print(result3)result4 = convert_li(result3)print(result4)

完整实现-源码解析

这段代码定义了两个加密/解密函数encrypt_zhangdecrypt_zhang,以及一个大小写转换函数convert_li

  1. 导入模块:

import string

导入了Python的string模块,该模块包含了一些常用的字符串常量和函数。 2. 定义字母列表:

upper_list = string.ascii_uppercase
lower_list = string.ascii_lowercase

upper_list包含了所有的大写英文字母,而lower_list包含了所有的小写英文字母。 3. encrypt_zhang函数: 这个函数实现了对输入字符串source中的每个字母进行右移6位的加密操作。

* 如果字母是大写的,则在`upper_list`中找到其位置,然后加6并取模得到新的位置,从而获取加密后的字母。
* 如果字母是小写的,则在`lower_list`中做类似的操作。
* 其他非字母字符不会被加密。
  1. convert_li函数: 这个函数实现了大小写转换的功能。

    • 如果字母是大写的(ASCII值在65-90之间),则将其转换为小写。

    • 如果字母是小写的(ASCII值在97-122之间),则将其转换为大写。

    • 其他非字母字符不会被转换。

  2. decrypt_zhang函数: 这个函数是encrypt_zhang的逆操作,实现了对输入字符串source中的每个字母进行左移6位的解密操作。其逻辑与encrypt_zhang相似,只是方向相反。

  3. 主程序:

    • 首先,使用encrypt_zhang函数加密字符串'ZHANGsan',并打印结果。

    • 然后,使用convert_li函数将加密后的字符串的大小写进行转换,并打印结果。

    • 接着,使用decrypt_zhang函数对上一步得到的字符串进行解密,并打印结果。

    • 最后,再次使用convert_li函数将解密后的字符串的大小写进行转换,并打印结果。

注意:虽然这段代码在逻辑上是正确的,但在实际应用中,这种简单的移位加密方法(如凯撒密码)并不安全,容易被破解。对于需要高安全性的场景,应使用更复杂的加密算法。

另外,这段代码中的encrypt_zhangdecrypt_zhang函数只处理了英文字母,对于其他字符(如数字、标点符号等)则不做处理。如果需要处理这些字符,可以在函数中添加相应的逻辑。

相关文章:

《Python加解密小实验:探索数据加密与解密的世界》

铺垫(1)-源码 import hashlib source "你好" # print(hashlib.md5(source.encode()).hexdigest())# 文件加解密 with open(../文件引用/index.png, rb) as file:data file.read() # print(hashlib.md5(data).hexdigest())# SHA也是摘要算法…...

C高级day四shell脚本

1.思维导图 2.终端输入一个C源文件名(.c结尾)判断文件是否有内容,如果没有内容删除文件,如果有内容编译并执行该文件。 #!/bin/bashread -p "请输入一个.c脚本名:" n if [ -s "$n" ] thenecho $n…...

android studio 写一个小计时器(版本二)

as版本&#xff1a;23.3.1patch2 例程&#xff1a;timer 在前一个版本的基本上改的&#xff0c;增加了继续的功能&#xff0c;实现方法稍微不同。 动画演示&#xff1a; activity_main.xml <?xml version"1.0" encoding"utf-8"?> <androidx…...

【网络安全实验室】SQL注入实战详情

如果额头终将刻上皱纹&#xff0c;你只能做到&#xff0c;不让皱纹刻在你的心上 1.最简单的SQL注入 查看源代码&#xff0c;登录名为admin 最简单的SQL注入&#xff0c;登录名写入一个常规的注入语句&#xff1a; 密码随便填&#xff0c;验证码填正确的&#xff0c;点击登录…...

华为,新华三,思科网络设备指令

1. 设备信息查看 华为 display version # 查看设备版本信息 display device # 查看设备硬件信息 新华三&#xff08;H3C&#xff09; display version # 查看设备版本信息 display device # 查看设备硬件信息 锐捷 show version …...

WebRTC线程的启动与运行

WebRTC线程运行的基本逻辑&#xff1a; while(true) {…Get(&msg, …);…Dispatch(&msg);… }Dispatch(Message *pmsg) {…pmsg->handler->OnMessage(pmsg);… }在执行函数内部&#xff0c;就是一个while死循环&#xff0c;只做两件事&#xff0c;从队列里Get取…...

Day3 微服务 微服务保护(请求限流、线程隔离、服务熔断)、Sentinel微服务保护框架、分布式事务(XA模式、AT模式)、Seata分布式事务框架

目录 1.微服务保护 1.1.服务保护方案 1.1.1 请求限流 1.1.2 线程隔离 1.1.3 服务熔断 1.2 Sentinel 1.2.1.介绍和安装 1.2.2 微服务整合 1.2.2.1 引入sentinel依赖 1.2.2.2 配置控制台 1.2.2.3 访问cart-service的任意端点 1.3 请求限流 1.4 线程隔离 1.4.1 OpenFeign整合Senti…...

第9章 子程序与函数调用

汇编语言是一种低级编程语言&#xff0c;它几乎是一对一地映射到计算机的机器码指令。在汇编语言中实现循环结构通常涉及到使用条件跳转指令&#xff08;如 JMP、JE、JNE 等&#xff09;来控制程序流程。下面我将通过一个简单的例子来讲解如何用x86汇编语言实现一个循环结构。 …...

manacher算法

Manacher 算法快速入门 Manacher 算法是一种用于寻找字符串中最长回文子串的高效算法&#xff0c;时间复杂度为 O(n)。 基本概念 回文 回文是一个字符串&#xff0c;从左到右和从右到左读都一样。 示例&#xff1a; 回文&#xff1a;"aba"、"abba"非回…...

Cocos2dx Lua绑定生成中间文件时参数类型与源码类型不匹配

这两天维护的一个项目&#xff0c;使用arm64-v8a指令集编译时遇到了报错&#xff0c;提示类型不匹配&#xff0c;具体报错的代码【脚本根据C源文件生成的中间文件】如下&#xff1a; const google::protobuf::RepeatedField<unsigned long long>& ret cobj->equi…...

为什么需要 std::call_once?

std::call_once 是 C 标准库中的一个函数&#xff0c;用来确保某个操作仅被执行一次&#xff0c;通常用于线程安全的初始化操作。它常与 std::once_flag 结合使用&#xff0c;后者用于标记某个操作是否已经执行过。 为什么需要 std::call_once&#xff1f; 在多线程程序中&am…...

ubuntu非root用户操作root权限问题-virbox挂在共享文件夹

首先讲一下&#xff0c;virtuallbox 挂在文件夹&#xff0c;操作的时候总是需要root权限&#xff0c;比较费劲。 这一操作其实也正对着我们在Ubuntu上的操作。 前段时间我想在ubuntu正常用户下去操作i2c&#xff0c;也出现了类似的问题。 后来把正常的操作加到组里面也解决了类…...

网络通讯协议

层次协议应用层HTTP, HTTPS, FTP, SMTP, POP3, IMAP, DNS, DHCP, SNMP, Telnet, SSH, SIP, RTP, RTCP, TFTP, NTP, ICMP, IGMP传输层TCP, UDP网络层IP, ICMP, IGMP数据链路层Ethernet, PPP, HDLC, ATM, Frame Relay ISO/OSI 参考模型协议应用层HTTP, HTTPS, FTP, SMTP, POP3, …...

centos,789使用mamba快速安装devtools

如何进入R语言运行环境请参考&#xff1a;Centos7_miniconda_devtools安装_R语言入门之R包的安装_r语言devtools包怎么安装-CSDN博客 在R里面使用安装devtools经常遇到依赖问题&#xff0c;排除过程过于费时&#xff0c;使用conda安装包等待时间长等。下面演示centos,789都是一…...

【人工智能机器学习基础篇】——深入详解强化学习之常用算法Q-Learning与策略梯度,掌握智能体与环境的交互机制

深入详解强化学习之常用算法&#xff1a;Q-Learning与策略梯度 强化学习&#xff08;Reinforcement Learning, RL&#xff09;作为机器学习的一个重要分支&#xff0c;近年来在多个领域取得了显著成果。从棋类游戏的人机对战到自主驾驶汽车&#xff0c;强化学习技术展示了其强大…...

银河麒麟桌面v10sp1修复引导笔记

1.安装双系统最好备份esp分区&#xff0c;uefi引导丢失可以用diskgen,选择工具再点击设置uefi bios&#xff0c;鼠标右键选择efi文件。 2.银河麒麟界面添加windows&#xff0c;复制EFI/Microsoft或者pe生成引导文件后&#xff0c;修复Windows引导用下面命令 /桌面# update-gru…...

深入理解 MVCC 与 BufferPool 缓存机制

深入理解 MVCC 与 BufferPool 缓存机制 在 MySQL 数据库中&#xff0c;MVCC&#xff08;Multi-Version Concurrency Control&#xff09;多版本并发控制机制和 BufferPool 缓存机制是非常重要的概念&#xff0c;它们对于保证数据的一致性、并发性以及提升数据库性能起着关键作用…...

vue实现下拉多选、可搜索、全选功能

最后的效果就是树形的下拉多选&#xff0c;可选择任意一级选项&#xff0c;下拉框中有一个按钮可以实现全选&#xff0c;也支持搜索功能。 在mounted生命周期里面获取全部部门的数据&#xff0c;handleTree是讲接口返回的数据整理成树形结构&#xff0c;可以自行解决 <div c…...

探秘Kafka源码:关键内容解析

文章目录 一、以kafka-3.0.0为例1.1安装 gradle 二、生产者源码2.1源码主流程图2.2 初始化2.3生产者sender线程初始化2.4 程序入口2.5生产者 main 线程初始化2.6 跳转到 KafkaProducer构造方法 一、以kafka-3.0.0为例 打开 IDEA&#xff0c;点击 File->Open…->源码包解…...

Android音频效果处理:基于`android.media.audiofx`包的原理、架构与实现

Android音频效果处理:基于android.media.audiofx包的原理、架构与实现 目录 引言Android音频框架概述android.media.audiofx包简介音频效果处理的原理 4.1 音频信号处理基础4.2 常见音频效果android.media.audiofx的架构设计 5.1 类结构分析5.2 设计模式应用系统定制与扩展 6…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...