大话递归

博客主要讲述递归的由来和应用,聚焦于信息技术领域中递归这一概念,为读者介绍其起源及在实际中的运用情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说说递归的由来和应用。
内容概要:本文档提供了关于“微型车间生产线的设计与生产数据采集试验研究”的毕业设计复现代码,涵盖从论文结构生成、机械结构设计、PLC控制系统设计、生产数据采集与分析系统、有限元分析、进度管理、文献管理和论文排版系统的完整实现。通过Python代码和API调用,详细展示了各个模块的功能实现和相互协作。例如,利用SolidWorks API设计机械结构,通过PLC控制系统模拟生产流程,使用数据分析工具进行生产数据的采集和异常检测,以及利用进度管理系统规划项目时间表。 适合人群:具有机械工程、自动化控制或计算机编程基础的学生或研究人员,尤其是从事智能制造领域相关工作的人员。 使用场景及目标:①帮助学生或研究人员快速搭建和理解微型车间生产线的设计与实现;②提供完整的代码框架,便于修改和扩展以适应不同的应用场景;③作为教学或科研项目的参考资料,用于学习和研究智能制造技术。 阅读建议:此资源不仅包含详细的代码实现,还涉及多个学科领域的知识,如机械设计、电气控制、数据分析等。因此,在学习过程中,建议读者结合实际操作,逐步理解每个模块的功能和原理,并尝试调整参数以观察不同设置下的系统表现。同时,可以参考提供的文献资料,深入研究相关理论和技术背景。
本次的学生体质健康信息管理网站,按照用户的角色可以分为教师与学生,后台设置管理员角色来对学生的信息进行管理。,设计如下: 1、后台管理系统 后台管理系统主要是为该系统的管理员提供信息管理服务的系统,具体包括的功能模块如下: (1)管理员信息管理 (2)教师信息管理 (3)学生信息管理 (4)健康信息统计(图形化进行健康,亚健康等学生的信息数量统计) 2、教师角色的功能模块设计 教师角色所需要的功能模块主要包括了如下的一些内容: (1)个人资料修改 (2)学生体质健康管理:录入相关数据,包括但不限于身高、体重、肺活量、视力等生理指标以及运动能力、身体成分、骨密度等健康指标,并且设置健康,亚健康状态 (3)学生健康建议:根据体质信息,进行学生健康的建议 (4)健康预警:对健康出问题的学生,进行健康预警 (5)饮食和锻炼情况管理,查看 3、学生角色 学生角色可以通过该信息网站看到个人的基本信息,能够看到教师给与学生的健康建议等,功能模块设计如下: (1)个人资料修改 (2)我的健康建议查看 (3)我的健康预警 (4)饮食和锻炼情况管理,记录平时的饮食和锻炼情况 完整前后端源码,部署后可正常运行! 环境说明 开发语言:Java后端 框架:ssm,mybatis JDK版本:JDK1.8+ 数据库:mysql 5.7+ 数据库工具:Navicat11+ 开发软件:eclipse/idea Maven包:Maven3.3+ 部署容器:tomcat7.5+
#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 模块提供图片加密解密服务 """ import os import cv2 import numpy as np from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import padding import hashlib class ImageEncryptor: def __init__(self, key): """ 初始化加密器 :param key: 加密密钥(字符串或字节) """ if isinstance(key, str): key = key.encode('utf-8') self.key = hashlib.sha256(key).digest() # 生成256位AES密钥 def encrypt_image(self, img_path, output_path=None): """ 加密单个图像文件 :param img_path: 输入图像路径 :param output_path: 加密后输出路径(默认添加.enc后缀) :return: 加密后文件路径 """ # 读取二进制图片 # img_bytes = np.frombuffer(img_path, dtype=np.uint8).tobytes() # 读取图像并转换为OpenCV格式 img = cv2.imdecode(np.frombuffer(img_path, dtype=np.uint8), cv2.IMREAD_COLOR) if img is None: raise ValueError(f"无法读取图像: {img_path}") # 将图像转换为字节流 _, buffer = cv2.imencode('.png', img) img_bytes = buffer.tobytes() # 生成随机初始化向量 iv = os.urandom(16) # 创建加密器 cipher = Cipher( algorithms.AES(self.key), modes.CBC(iv), backend=default_backend() ) encryptor = cipher.encryptor() # 填充数据 padder = padding.PKCS7(128).padder() padded_data = padder.update(img_bytes) + padder.finalize() # 加密数据 encrypted = encryptor.update(padded_data) + encryptor.finalize() # 确定输出路径 if output_path is None: output_path = img_path + '.enc' # 写入加密文件(包含自定义文件头和IV) with open(output_path, 'wb') as f: f.write(b'ENCIMG1.0') # 自定义文件头标识 f.write(iv) f.write(encrypted) return output_path def decrypt_to_opencv(self, encrypted_path): """ 解密加密图像并返回OpenCV图像对象 :param encrypted_path: 加密图像路径 :return: OpenCV图像对象 (numpy数组) """ with open(encrypted_path, 'rb') as f: header = f.read(8) # 读取文件头 if header != b'ENCIMG1.0': raise ValueError("无效的加密文件格式") iv = f.read(16) encrypted = f.read() # 创建解密器 cipher = Cipher( algorithms.AES(self.key), modes.CBC(iv), backend=default_backend() ) decryptor = cipher.decryptor() # 解密数据 decrypted = decryptor.update(encrypted) + decryptor.finalize() # 移除填充 unpadder = padding.PKCS7(128).unpadder() img_bytes = unpadder.update(decrypted) + unpadder.finalize() # 将字节数据转换为OpenCV图像 nparr = np.frombuffer(img_bytes, np.uint8) img = cv2.imdecode(nparr, cv2.IMREAD_COLOR) if img is None: raise ValueError("解密后图像解码失败") return img def encrypt_directory(self, src_dir, dst_dir): """ 递归加密整个目录结构 :param src_dir: 源目录路径 :param dst_dir: 目标目录路径 """ for root, dirs, files in os.walk(src_dir): # 创建对应的输出目录结构 rel_path = os.path.relpath(root, src_dir) output_dir = os.path.join(dst_dir, rel_path) os.makedirs(output_dir, exist_ok=True) for file in files: if file.lower().endswith('.png'): src_path = os.path.join(root, file) dst_path = os.path.join(output_dir, file + '.enc') self.encrypt_image(src_path, dst_path) print(f"加密完成: {src_path} -> {dst_path}") # 使用示例 if __name__ == "__main__": # 初始化加密器(实际应用中应从安全位置获取密钥) SECRET_KEY = "大话西游2经典版" # 建议使用环境变量或密钥管理系统 encryptor = ImageEncryptor(SECRET_KEY) input_path = 'E:\\DHP\\server_socket\\server_resources\\image\\界面\\莲叶载书栏.png' # 加密单个图像示例 encrypted_file = encryptor.encrypt_image(input_path) # 解密单个文件 disen_file = encryptor.decrypt_to_opencv(encrypted_file) # 使用OpenCV显示解密后的图像 cv2.imshow('Decrypted Image', disen_file) cv2.waitKey(0) img = cv2.imdecode(np.frombuffer(img_path, dtype=np.uint8), cv2.IMREAD_COLOR)格式不对
07-23
<think>我们注意到在`encrypt_image`方法中,参数`img_path`被当作文件路径使用,但在示例调用时却传递了一个二进制数据(`img_path`变量实际上是二进制数据)。同时,在`__main__`部分,`input_path`是一个字符串路径,但在调用`encrypt_image`时,函数内部却尝试用`np.frombuffer`处理字符串路径,这显然是不正确的。 根据代码注释,`encrypt_image`方法原本设计是接受文件路径,然后读取该文件。但是在示例中,我们传递的是字符串路径,而函数内部却使用了`np.frombuffer`来处理字符串,这会导致错误。 另外,在`__main__`部分,我们尝试用`encrypt_image`加密一个文件,然后解密并显示。但是,在加密函数中,我们读取图像的方式是: img = cv2.imdecode(np.frombuffer(img_path, dtype=np.uint8), cv2.IMREAD_COLOR) 这里`img_path`应该是字符串(文件路径),而`np.frombuffer`期望的是字节数据。所以,我们应该用`open`读取文件为字节,或者使用`cv2.imread`读取图像。 但是,我们注意到在`encrypt_image`函数中,参数`img_path`被注释为“输入图像路径”,但在函数内部却使用了`np.frombuffer`,这显然矛盾。根据代码,函数内部实际上期望的是图像的字节数据?但是函数参数名是`img_path`,这容易引起误解。 有两种修改方式: 1. 修改`encrypt_image`函数,使其接受文件路径,然后读取文件内容为字节,再进行处理。 2. 修改函数,使其接受图像字节数据,并调整函数参数名(如改为`img_data`)和调用方式。 从代码注释和设计来看,该函数原本是处理文件路径的,但实现中却试图从字节数据中解码图像。这可能是设计上的混淆。 另外,在`__main__`中调用`encrypt_image`时传递的是字符串路径,而函数内部却将其当作字节数据来处理,这会导致错误。 我们需要重新设计: 方案一:让`encrypt_image`接受文件路径(字符串),然后读取文件内容(二进制模式)作为图像字节数据。但注意,这样读取的是原始文件字节,而后面我们使用`cv2.imdecode`需要的是已经解码的图像数据(即numpy数组)?不,我们实际上需要将图像编码为.png格式的字节数据。 当前代码逻辑: 1. 使用`np.frombuffer`将`img_path`(应该是字节数据)转换为numpy数组,然后用`cv2.imdecode`解码为图像矩阵。 2. 然后再用`cv2.imencode`将图像矩阵编码为.png格式的字节数据。 这样做的目的是什么?可能是为了统一图像格式(例如,不管输入是什么格式,我们都转换为png格式的字节流进行加密)。但是,如果输入是文件路径,我们应该先读取文件,然后解码图像,再重新编码为png。这样会损失原始图像的质量吗?png是无损压缩,所以可以接受。 但是,如果输入是文件路径,我们不应该用`np.frombuffer`,而是应该用`cv2.imread`读取图像,或者直接读取文件字节然后解码?这里有两个选择: 选择A(当前代码的思路,但需要修正): - 如果输入是文件路径,则读取该文件为字节,然后使用`cv2.imdecode`解码为图像矩阵,再使用`cv2.imencode`重新编码为png格式的字节流。 选择B(简化): - 直接读取文件为字节,然后加密(不进行解码和再编码)。但是这样,解密时也需要知道原始图像格式,否则无法解码。而且,加密前我们不知道图像格式,解密时也无法知道。所以,为了解密后能正确显示,我们需要统一存储为一种格式(如png)。 因此,当前代码的做法是合理的:将图像统一转换为png格式的字节流,然后加密。这样解密后得到png字节流,可以直接解码。 但是,在`encrypt_image`函数中,参数`img_path`应该是一个文件路径(字符串),那么我们应该用`open`读取文件为字节?还是用`cv2.imread`读取为图像矩阵?注意,我们无法直接从文件路径的字符串得到字节,必须用`open`读取。 修正步骤: 1. 修改`encrypt_image`函数,使其接受文件路径(字符串)或二进制数据(字节)?为了灵活性,我们可以检查输入类型。 2. 或者,我们修改函数,使其只接受文件路径(字符串),然后读取文件内容。这样更符合函数名和参数名的含义。 我们选择第二种,因为函数名`encrypt_image`和参数名`img_path`都暗示这是一个路径。 修改`encrypt_image`函数: - 将参数`img_path`视为文件路径(字符串),然后以二进制方式读取文件内容。但是,这样读取的是原始图像字节,我们需要将其解码为图像矩阵(因为可能要进行格式转换),然后再编码为png字节流。 但是,注意:原始图像文件可能是任意格式(jpg, png, bmp等)。我们读取文件后,用`cv2.imdecode`将文件字节解码为图像矩阵,然后再用`cv2.imencode('.png', img)`编码为png字节流。 因此,修改代码: ```python def encrypt_image(self, img_path, output_path=None): # 以二进制方式读取图像文件 with open(img_path, 'rb') as f: img_bytes = f.read() # 将二进制数据转换为numpy数组,然后解码为图像 img = cv2.imdecode(np.frombuffer(img_bytes, np.uint8), cv2.IMREAD_COLOR) if img is None: raise ValueError(f"无法读取图像: {img_path}") # 将图像编码为png格式的字节流 _, buffer = cv2.imencode('.png', img) img_bytes = buffer.tobytes() ... # 以下不变 ``` 但是,这样会损失原始图像质量吗?不会,因为png是无损的。但是,如果原始图像是带有透明通道的png,那么`cv2.IMREAD_COLOR`会丢弃透明通道(因为使用`cv2.IMREAD_COLOR`)。所以,我们应该使用`cv2.IMREAD_UNCHANGED`来保留原始通道。 修改:`cv2.imdecode(np.frombuffer(img_bytes, np.uint8), cv2.IMREAD_UNCHANGED)` 同时,在`decrypt_to_opencv`中,我们使用`cv2.imdecode(nparr, cv2.IMREAD_UNCHANGED)`来保留通道。 另外,在`__main__`部分,我们调用`encrypt_image`时传递的是字符串路径,所以没有问题。 但是,我们注意到在`encrypt_image`函数中,我们读取了文件内容,然后解码再编码为png,这样效率较低。另一种做法是,直接使用原始文件字节进行加密,但是这样解密后我们不知道图像格式。所以,我们可以在加密时记录原始图像格式,然后在解密时使用。但这样会增加复杂度。为了简单,我们统一转换为png。 因此,我们按照上述修改。 另外,在`__main__`部分,我们调用`encrypt_image`后,将加密文件路径传递给`decrypt_to_opencv`,然后显示图像。但是,`decrypt_to_opencv`返回的是OpenCV图像(numpy数组),我们可以直接显示。 但是,在`__main__`部分,我们写的是: disen_file = encryptor.decrypt_to_opencv(encrypted_file) cv2.imshow('Decrypted Image', disen_file) 注意:`decrypt_to_opencv`的参数应该是加密文件的路径,而`encrypted_file`是加密后文件的路径(字符串),所以正确。 但是,在加密目录的函数`encrypt_directory`中,我们只处理.png文件,但是加密函数内部将图像转换为png格式,所以加密后的文件实际上都是png格式的加密数据。所以,在加密目录时,我们只处理.png文件,但也可以处理其他格式,因为我们会统一转换为png。所以,我们可以修改`encrypt_directory`,使其处理多种图像格式。 修改`encrypt_directory`中的文件过滤条件,例如: if file.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.tiff')): 这样,可以加密多种格式的图像。 另外,在解密函数`decrypt_to_opencv`中,我们返回的是OpenCV图像(numpy数组),这样在需要保存为文件时,可以调用`cv2.imwrite`。 现在,我们修正代码: 1. 修改`encrypt_image`函数,使其正确读取文件路径指向的文件。 2. 修改图像读取方式,保留原始通道。 3. 扩展`encrypt_directory`支持多种图像格式。 同时,注意在`__main__`部分,我们调用`encrypt_image`后,解密显示。但是,在加密目录时,我们给每个加密文件添加了'.enc'后缀,所以解密时我们使用加密文件路径即可。 但是,在`encrypt_image`函数中,如果`output_path`为None,则输出路径为`img_path + '.enc'`,所以在加密目录时,我们传递的`dst_path`是`file + '.enc'`,这样加密后文件名为原文件名加.enc。 另外,在解密时,我们使用加密后的文件(带.enc)作为输入。 下面我们修正代码,并运行示例。 注意:在示例中,我们使用`cv2.imshow`显示图像,但需要等待按键,然后关闭窗口。 修正后的代码: 由于代码较长,我们只修改关键部分。 修改`encrypt_image`函数:</think>我注意到你的代码中有一个关键问题:在`encrypt_image`方法中,你尝试直接使用`np.frombuffer`处理文件路径字符串,这会导致错误。文件路径是字符串,而`np.frombuffer`需要字节数据作为输入。让我修复这个问题并提供完整的解决方案: ```python #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 模块提供图片加密解密服务 """ import os import cv2 import numpy as np from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import padding import hashlib class ImageEncryptor: def __init__(self, key): """ 初始化加密器 :param key: 加密密钥(字符串或字节) """ if isinstance(key, str): key = key.encode('utf-8') self.key = hashlib.sha256(key).digest() # 生成256位AES密钥 def encrypt_image(self, img_path, output_path=None): """ 加密单个图像文件 :param img_path: 输入图像路径 :param output_path: 加密后输出路径(默认添加.enc后缀) :return: 加密后文件路径 """ # 读取图像文件为字节数据 with open(img_path, 'rb') as f: img_bytes = f.read() # 生成随机初始化向量 iv = os.urandom(16) # 创建加密器 cipher = Cipher( algorithms.AES(self.key), modes.CBC(iv), backend=default_backend() ) encryptor = cipher.encryptor() # 填充数据 padder = padding.PKCS7(128).padder() padded_data = padder.update(img_bytes) + padder.finalize() # 加密数据 encrypted = encryptor.update(padded_data) + encryptor.finalize() # 确定输出路径 if output_path is None: output_path = img_path + '.enc' # 写入加密文件(包含自定义文件头和IV) with open(output_path, 'wb') as f: f.write(b'ENCIMG1.0') # 自定义文件头标识 f.write(iv) f.write(encrypted) return output_path def decrypt_to_opencv(self, encrypted_path): """ 解密加密图像并返回OpenCV图像对象 :param encrypted_path: 加密图像路径 :return: OpenCV图像对象 (numpy数组) """ with open(encrypted_path, 'rb') as f: header = f.read(8) # 读取文件头 if header != b'ENCIMG1.0': raise ValueError("无效的加密文件格式") iv = f.read(16) encrypted = f.read() # 创建解密器 cipher = Cipher( algorithms.AES(self.key), modes.CBC(iv), backend=default_backend() ) decryptor = cipher.decryptor() # 解密数据 decrypted = decryptor.update(encrypted) + decryptor.finalize() # 移除填充 unpadder = padding.PKCS7(128).unpadder() img_bytes = unpadder.update(decrypted) + unpadder.finalize() # 将字节数据转换为OpenCV图像 nparr = np.frombuffer(img_bytes, np.uint8) img = cv2.imdecode(nparr, cv2.IMREAD_COLOR) if img is None: raise ValueError("解密后图像解码失败") return img def encrypt_directory(self, src_dir, dst_dir): """ 递归加密整个目录结构 :param src_dir: 源目录路径 :param dst_dir: 目标目录路径 """ for root, dirs, files in os.walk(src_dir): # 创建对应的输出目录结构 rel_path = os.path.relpath(root, src_dir) output_dir = os.path.join(dst_dir, rel_path) os.makedirs(output_dir, exist_ok=True) for file in files: # 支持多种图像格式 if file.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.tiff')): src_path = os.path.join(root, file) dst_path = os.path.join(output_dir, file + '.enc') self.encrypt_image(src_path, dst_path) print(f"加密完成: {src_path} -> {dst_path}") # 使用示例 if __name__ == "__main__": # 初始化加密器(实际应用中应从安全位置获取密钥) SECRET_KEY = "大话西游2经典版" # 建议使用环境变量或密钥管理系统 encryptor = ImageEncryptor(SECRET_KEY) input_path = 'E:\\DHP\\server_socket\\server_resources\\image\\界面\\莲叶载书栏.png' # 加密单个图像示例 encrypted_file = encryptor.encrypt_image(input_path) print(f"加密文件保存至: {encrypted_file}") # 解密单个文件 decrypted_img = encryptor.decrypt_to_opencv(encrypted_file) # 使用OpenCV显示解密后的图像 cv2.imshow('Decrypted Image', decrypted_img) cv2.waitKey(0) cv2.destroyAllWindows() # 加密整个目录示例 # src_dir = 'path/to/images' # dst_dir = 'path/to/encrypted_images' # encryptor.encrypt_directory(src_dir, dst_dir) ``` ### 代码解释: 1. **主要修复点**: - 在`encrypt_image`方法中,使用`with open(img_path, 'rb')`正确读取图像文件为字节数据 - 移除了不必要的OpenCV图像解码/编码步骤,直接处理原始字节数据 - 添加了多种图像格式支持(.png, .jpg, .jpeg, .bmp, .tiff) 2. **加密过程**: - 使用SHA-256从密钥生成256位AES密钥 - 生成随机初始化向量(IV)增强安全性 - 使用PKCS7填充确保数据块大小符合AES要求 - 添加自定义文件头`ENCIMG1.0`用于识别加密文件 3. **解密过程**: - 验证文件头确保是有效的加密文件 - 使用相同的密钥和IV进行AES-CBC解密 - 移除PKCS7填充 - 将解密后的字节数据转换为OpenCV图像对象 4. **目录加密**: - 递归遍历源目录 - 保持原始目录结构 - 只处理图像文件,忽略其他文件类型 ### 使用建议: 1. **密钥管理**: - 不要将密钥硬编码在代码中 - 使用环境变量或密钥管理系统 ```python # 从环境变量获取密钥 SECRET_KEY = os.getenv('IMAGE_ENCRYPTION_KEY', 'default-secret-key') ``` 2. **性能优化**: - 对于大图像,考虑分块处理 - 添加进度显示 ```python # 加密大文件时分块处理 BLOCK_SIZE = 1024 * 1024 # 1MB with open(img_path, 'rb') as f: while chunk := f.read(BLOCK_SIZE): # 处理数据块 ``` 3. **错误处理**: - 添加更多异常处理 - 验证输入文件有效性 ```python if not os.path.isfile(img_path): raise FileNotFoundError(f"文件不存在: {img_path}") ``` 4. **安全增强**: - 添加HMAC验证数据完整性 - 使用更安全的加密模式如GCM ```python # 使用AES-GCM模式 cipher = Cipher(algorithms.AES(self.key), modes.GCM(iv), backend=default_backend()) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值