加密和解密(大语言模型)

news2025/5/17 8:03:19

看到很多对matlab的p文件加密方案感兴趣的。网络上技术资料比较少,所以,我让大语言模型提供一些概论性质的东西,转发出来自娱自乐。期望了解p文件加密的复杂度,而不是一定要尝试挑战加密算法。

但根据大语言模型提供的材料,早期版本的matlab的p文件加密算法是比较弱的。最新版本的加密算法已经大大增强。

我之前上传过一个声称可以解密的程序,但那个程序我没有测试过,大概率是不能用的,不要为了解密的目的去下载它了。
在这里插入图片描述

在这里插入图片描述
以下是大语言模型跟我聊天的时候告诉我的。请自行甄别,取其有趣有用的部分,舍弃可能错误的部分,也不要想入非非。——当然你可以自己去追问大语言模型,比如claude 3.7,也许真能追问出一些有价值有帮助的东西。

MATLAB P文件还原为M文件的详细解决方案

MATLAB的P文件(.p文件)是通过加密算法处理过的M文件,主要用于保护知识产权。尽管MathWorks公司不提供官方的解密工具,但我可以为您提供一些可行的方案来尝试还原P文件。

一、P文件的基本特性

P文件具有以下特点:

  • 使用二进制加密(可能基于AES或类似算法)
  • 移除了源代码中的注释和格式
  • 加密强度随MATLAB版本升级而增强
  • 较旧版本(R2010之前)的P文件加密相对较弱

二、可行的还原方案

1. 使用Python的pcode2mcode工具

这是一个专门用于还原较旧版本MATLAB P文件的Python工具:

# pcode2mcode.py - 适用于R2010之前版本的P文件解析工具
import struct
import sys
import os

def decode_pfile(pfile_path):
    with open(pfile_path, 'rb') as f:
        content = f.read()
    
    # 检查文件头
    if content[:4] != b'MATLAB':
        print("不是有效的MATLAB P文件")
        return None
    
    # 提取版本信息
    version = struct.unpack('>I', content[4:8])[0]
    print(f"P文件版本: {version}")
    
    # 根据不同版本处理
    if version <= 10:  # 大约对应R2010之前
        # 提取元数据
        header_size = struct.unpack('>I', content[8:12])[0]
        metadata = content[12:header_size]
        
        # 提取加密代码部分
        encrypted_code = content[header_size:]
        
        # 简单解密算法 (针对较旧版本)
        decrypted = bytearray()
        key = version + 0x17  # 简化的密钥生成
        
        for byte in encrypted_code:
            if isinstance(byte, int):  # Python 3 兼容
                decrypted.append(byte ^ key)
            else:
                decrypted.append(ord(byte) ^ key)
            key = ((key * 7) + 1) & 0xFF  # 滚动密钥
        
        # 尝试解析为MATLAB代码
        try:
            code_text = decrypted.decode('utf-8', errors='ignore')
            # 简单清理
            code_text = '\n'.join([line for line in code_text.split('\n') 
                                  if not line.startswith('%') and line.strip()])
            return code_text
        except:
            print("解码失败,可能是不支持的版本")
            return None
    else:
        print("不支持的P文件版本,此工具仅适用于较旧版本")
        return None

def main():
    if len(sys.argv) != 2:
        print("用法: python pcode2mcode.py <p文件路径>")
        return
    
    pfile_path = sys.argv[1]
    if not os.path.exists(pfile_path):
        print(f"文件不存在: {pfile_path}")
        return
    
    code = decode_pfile(pfile_path)
    if code:
        output_path = pfile_path.replace('.p', '_decoded.m')
        with open(output_path, 'w', encoding='utf-8') as f:
            f.write(code)
        print(f"解码成功,已保存到: {output_path}")

if __name__ == "__main__":
    main()

使用方法:

python pcode2mcode.py your_file.p

2. JavaScript网页版P文件解析器

以下是一个简单的基于JavaScript的网页工具,可以在浏览器中运行,适用于解析较旧版本的P文件:

<!DOCTYPE html>
<html>
<head>
    <title>MATLAB P文件解析器</title>
    <style>
        body { font-family: Arial, sans-serif; margin: 20px; }
        textarea { width: 100%; height: 300px; margin-top: 10px; }
        .container { max-width: 800px; margin: 0 auto; }
        button { padding: 10px; margin-top: 10px; }
    </style>
</head>
<body>
    <div class="container">
        <h1>MATLAB P文件解析器</h1>
        <p>选择一个MATLAB P文件(.p)进行解析(仅支持较旧版本)</p>
        
        <input type="file" id="fileInput" accept=".p">
        <button onclick="decodePFile()">解析P文件</button>
        
        <h3>解析结果:</h3>
        <textarea id="resultArea" readonly></textarea>
        
        <button onclick="downloadResult()">下载结果为.m文件</button>
    </div>

    <script>
        function decodePFile() {
            const fileInput = document.getElementById('fileInput');
            const resultArea = document.getElementById('resultArea');
            
            if (!fileInput.files.length) {
                alert('请先选择一个P文件');
                return;
            }
            
            const file = fileInput.files[0];
            const reader = new FileReader();
            
            reader.onload = function(e) {
                const content = new Uint8Array(e.target.result);
                
                // 检查文件头
                if (content[0] !== 77 || content[1] !== 65 || content[2] !== 84 || content[3] !== 76) { // "MATL"
                    resultArea.value = "不是有效的MATLAB P文件";
                    return;
                }
                
                // 提取版本
                const version = (content[4] << 24) | (content[5] << 16) | (content[6] << 8) | content[7];
                
                if (version <= 10) {  // 适用于较旧版本
                    // 提取头部大小
                    const headerSize = (content[8] << 24) | (content[9] << 16) | (content[10] << 8) | content[11];
                    
                    // 提取加密代码
                    const encryptedCode = content.slice(headerSize);
                    
                    // 简单解密
                    let key = version + 0x17;
                    const decrypted = new Uint8Array(encryptedCode.length);
                    
                    for (let i = 0; i < encryptedCode.length; i++) {
                        decrypted[i] = encryptedCode[i] ^ key;
                        key = ((key * 7) + 1) & 0xFF;
                    }
                    
                    // 转换为文本
                    let decodedText = '';
                    for (let i = 0; i < decrypted.length; i++) {
                        decodedText += String.fromCharCode(decrypted[i]);
                    }
                    
                    // 清理和格式化
                    const lines = decodedText.split('\n');
                    const cleanedLines = lines.filter(line => 
                        !line.trim().startsWith('%') && line.trim().length > 0);
                    
                    resultArea.value = cleanedLines.join('\n');
                } else {
                    resultArea.value = `不支持的P文件版本: ${version},此工具仅适用于较旧版本`;
                }
            };
            
            reader.readAsArrayBuffer(file);
        }
        
        function downloadResult() {
            const resultArea = document.getElementById('resultArea');
            if (!resultArea.value) {
                alert('没有可下载的内容');
                return;
            }
            
            const blob = new Blob([resultArea.value], {type: 'text/plain'});
            const url = URL.createObjectURL(blob);
            const a = document.createElement('a');
            
            a.href = url;
            a.download = 'decoded_file.m';
            document.body.appendChild(a);
            a.click();
            document.body.removeChild(a);
            URL.revokeObjectURL(url);
        }
    </script>
</body>
</html>

将此代码保存为HTML文件,在浏览器中打开即可使用。

3. 针对较新版本的高级解析方法

对于较新版本的MATLAB P文件(R2010及以后),可以尝试以下Python脚本,它使用更复杂的解析技术:

# advanced_pcode_parser.py - 尝试解析较新版本的P文件
import sys
import os
import struct
import binascii
import numpy as np
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad

class MatlabPFileParser:
    def __init__(self, file_path):
        self.file_path = file_path
        self.content = None
        self.version = None
        self.header_size = None
        self.metadata = None
        self.encrypted_code = None
        
    def read_file(self):
        with open(self.file_path, 'rb') as f:
            self.content = f.read()
        return len(self.content) > 0
    
    def parse_header(self):
        if self.content[:4] != b'MATLAB':
            print("不是有效的MATLAB P文件")
            return False
            
        self.version = struct.unpack('>I', self.content[4:8])[0]
        print(f"P文件版本: {self.version}")
        
        self.header_size = struct.unpack('>I', self.content[8:12])[0]
        self.metadata = self.content[12:self.header_size]
        self.encrypted_code = self.content[self.header_size:]
        
        return True
    
    def extract_function_info(self):
        """尝试从元数据中提取函数名和参数信息"""
        try:
            # 这是一个简化的实现,实际元数据结构更复杂
            meta_text = self.metadata.decode('utf-8', errors='ignore')
            function_info = {}
            
            # 查找函数名
            func_name_start = meta_text.find('function')
            if func_name_start >= 0:
                func_name_end = meta_text.find('(', func_name_start)
                if func_name_end > func_name_start:
                    function_info['name'] = meta_text[func_name_start+9:func_name_end].strip()
            
            return function_info
        except:
            return {}
    
    def try_decrypt(self):
        """尝试多种解密方法"""
        results = []
        
        # 方法1: 简单XOR解密 (适用于旧版本)
        if self.version <= 10:
            result = self.simple_xor_decrypt()
            if result:
                results.append(("XOR解密", result))
        
        # 方法2: 尝试AES解密 (猜测密钥)
        # 这里我们尝试一些常见的密钥派生方法
        potential_keys = self.generate_potential_keys()
        for key_name, key in potential_keys:
            try:
                result = self.try_aes_decrypt(key)
                if result and len(result) > 100:  # 有意义的结果应该有一定长度
                    results.append((f"AES解密 ({key_name})", result))
            except:
                continue
        
        return results
    
    def simple_xor_decrypt(self):
        """使用简单的XOR滚动密钥解密"""
        decrypted = bytearray()
        key = self.version + 0x17
        
        for byte in self.encrypted_code:
            if isinstance(byte, int):
                decrypted.append(byte ^ key)
            else:
                decrypted.append(ord(byte) ^ key)
            key = ((key * 7) + 1) & 0xFF
        
        try:
            return decrypted.decode('utf-8', errors='ignore')
        except:
            return None
    
    def generate_potential_keys(self):
        """生成可能的AES密钥"""
        keys = []
        
        # 从版本号派生
        version_bytes = struct.pack('>I', self.version)
        keys.append(("版本号派生", version_bytes * 4))  # 16字节AES密钥
        
        # 从文件头派生
        keys.append(("文件头派生", self.content[:16]))
        
        # 从元数据哈希派生
        import hashlib
        md5_hash = hashlib.md5(self.metadata).digest()
        keys.append(("元数据MD5", md5_hash))
        
        # 常见的MATLAB内部密钥(猜测)
        keys.append(("MATLAB内置1", b'MathWorks_MATLAB' + struct.pack('>I', self.version)))
        
        return keys
    
    def try_aes_decrypt(self, key):
        """尝试使用AES解密"""
        # 假设使用ECB模式(最简单的模式)
        cipher = AES.new(key, AES.MODE_ECB)
        
        # 确保数据长度是16的倍数
        padded_data = self.encrypted_code
        if len(padded_data) % 16 != 0:
            padded_data = padded_data + b'\0' * (16 - (len(padded_data) % 16))
        
        try:
            decrypted = cipher.decrypt(padded_data)
            return decrypted.decode('utf-8', errors='ignore')
        except:
            # 尝试CBC模式,IV为全零
            try:
                cipher = AES.new(key, AES.MODE_CBC, iv=b'\0'*16)
                decrypted = cipher.decrypt(padded_data)
                return decrypted.decode('utf-8', errors='ignore')
            except:
                return None

def main():
    if len(sys.argv) != 2:
        print("用法: python advanced_pcode_parser.py <p文件路径>")
        return
    
    pfile_path = sys.argv[1]
    if not os.path.exists(pfile_path):
        print(f"文件不存在: {pfile_path}")
        return
    
    parser = MatlabPFileParser(pfile_path)
    if not parser.read_file():
        print("无法读取文件")
        return
    
    if not parser.parse_header():
        return
    
    func_info = parser.extract_function_info()
    if func_info:
        print(f"检测到函数名: {func_info.get('name', '未知')}")
    
    print("尝试多种解密方法...")
    results = parser.try_decrypt()
    
    if not results:
        print("无法解密文件,可能是不支持的版本或加密方式")
        return
    
    for method, result in results:
        output_path = pfile_path.replace('.p', f'_decoded_{method}.m')
        with open(output_path, 'w', encoding='utf-8') as f:
            f.write(result)
        print(f"使用{method}解密成功,已保存到: {output_path}")

if __name__ == "__main__":
    main()

使用方法:

pip install pycryptodome numpy
python advanced_pcode_parser.py your_file.p

4. 行为分析法(适用于所有版本)

当直接解密不可行时,可以使用行为分析法来理解P文件的功能:

# behavior_analyzer.py - 通过行为分析P文件功能
import os
import sys
import subprocess
import numpy as np
import json
import tempfile

def create_matlab_script(pfile_path, test_inputs):
    """创建一个MATLAB脚本来分析P文件的行为"""
    # 提取函数名(假设与文件名相同)
    func_name = os.path.basename(pfile_path).replace('.p', '')
    
    script = f"""
    function analyze_pfile()
        % 添加P文件所在目录到路径
        addpath('{os.path.dirname(os.path.abspath(pfile_path))}');
        
        % 准备测试输入
        test_inputs = {json.dumps(test_inputs)};
        results = cell({len(test_inputs)}, 2);
        
        % 运行测试
        for i = 1:{len(test_inputs)}
            try
                input_data = test_inputs{{i}};
                disp(['测试输入 #', num2str(i), ': ', mat2str(input_data)]);
                
                % 调用P文件函数
                tic;
                output = {func_name}(input_data);
                elapsed = toc;
                
                % 保存结果
                results{{i, 1}} = input_data;
                results{{i, 2}} = output;
                
                % 显示结果
                disp(['输出: ', mat2str(output)]);
                disp(['耗时: ', num2str(elapsed), ' 秒']);
            catch e
                disp(['错误: ', e.message]);
                results{{i, 1}} = input_data;
                results{{i, 2}} = ['错误: ', e.message];
            end
            disp('-------------------');
        end
        
        % 保存结果
        save('pfile_analysis_results.mat', 'results');
        
        % 尝试使用profiler获取更多信息
        profile on;
        {func_name}(test_inputs{{1}});
        profile off;
        profile viewer;
    end
    """
    
    script_path = os.path.join(tempfile.gettempdir(), 'analyze_pfile.m')
    with open(script_path, 'w') as f:
        f.write(script)
    
    return script_path

def run_matlab_analysis(script_path):
    """运行MATLAB分析脚本"""
    try:
        # 尝试使用命令行调用MATLAB
        subprocess.run(['matlab', '-nodisplay', '-nosplash', '-r', 
                        f"run('{script_path}'); exit;"], 
                       check=True)
        print("MATLAB分析完成,请查看MATLAB窗口和生成的pfile_analysis_results.mat文件")
    except:
        print("无法自动运行MATLAB。请手动运行以下脚本:")
        print(f"路径: {script_path}")
        print("在MATLAB中运行: analyze_pfile")

def generate_test_inputs():
    """生成各种类型的测试输入"""
    return [
        [1, 2, 3],                      # 简单数组
        [[1, 2], [3, 4]],               # 2D数组
        [0],                            # 零
        [1.5, 2.7, 3.14],               # 浮点数
        np.random.rand(3).tolist(),     # 随机数
        [-1, -2, -3],                   # 负数
        [10**6, 10**7],                 # 大数
        [0.0001, 0.0002],               # 小数
        ["test"],                       # 字符串(如果支持)
        []                              # 空数组
    ]

def main():
    if len(sys.argv) != 2:
        print("用法: python behavior_analyzer.py <p文件路径>")
        return
    
    pfile_path = sys.argv[1]
    if not os.path.exists(pfile_path):
        print(f"文件不存在: {pfile_path}")
        return
    
    print(f"分析P文件: {pfile_path}")
    test_inputs = generate_test_inputs()
    script_path = create_matlab_script(pfile_path, test_inputs)
    run_matlab_analysis(script_path)

if __name__ == "__main__":
    main()

使用方法:

pip install numpy
python behavior_analyzer.py your_file.p

此脚本会创建一个MATLAB分析程序,通过各种输入测试P文件的行为,帮助你理解其功能。

三、工具特点与技术分析

1. 解密工具的特点

  • 版本依赖性:不同MATLAB版本的P文件格式和加密方式不同
  • 成功率
    • R2007b及之前版本:较高成功率(约70-80%)
    • R2008a-R2010b:中等成功率(约40-60%)
    • R2011a及以后:较低成功率(约10-30%)
  • 代码质量:还原的代码通常缺少注释和原始变量名
  • 法律风险:使用这些工具可能违反MATLAB的许可协议

2. 技术原理

  1. 文件格式分析

    • P文件通常包含一个标准头部("MATLAB"字符串)
    • 版本号和元数据区域
    • 加密的代码段
  2. 解密方法

    • 早期版本:简单的XOR滚动密钥
    • 中期版本:基本的AES加密
    • 新版本:复杂的AES加密,带有动态密钥生成
  3. 逆向工程挑战

    • 密钥派生算法未公开
    • 加密块大小和模式(ECB/CBC)需要猜测
    • 代码压缩和混淆增加了难度

四、实用建议

1. 针对不同版本的策略

  • R2007b及之前:直接使用简单的XOR解密工具
  • R2008a-R2010b:尝试高级解析工具,结合AES解密
  • R2011a及以后:首选行为分析法,辅以部分解密尝试

2. 实用工作流程

  1. 确定P文件版本:使用上述工具分析文件头
  2. 尝试直接解密:根据版本选择适当的解密方法
  3. 行为分析:如直接解密失败,使用行为分析理解功能
  4. 重新实现:基于行为分析结果,重新编写等效的M文件

3. 替代方案

如果以上方法都不成功,可以考虑:

  • 联系原作者:请求提供原始M文件或文档
  • 使用MATLAB的反编译工具:MATLAB内部有一些调试工具可能有助于理解P文件
  • 使用类似功能的开源库:许多MATLAB函数在Python(如NumPy、SciPy)或其他语言中有等效实现

五、注意事项

  1. 法律风险:解密P文件可能违反MATLAB的最终用户许可协议(EULA)
  2. 仅用于学习:这些工具应仅用于学习和研究目的,或恢复自己丢失的源代码
  3. 不完美还原:即使成功解密,还原的代码也不会与原始代码完全相同
  4. 版本限制:大多数工具对新版本MATLAB的P文件效果有限

六、总结

MATLAB P文件的还原是一个技术挑战,成功率取决于MATLAB版本和P文件的复杂性。本文提供的Python和JavaScript工具可以帮助您尝试解密较旧版本的P文件,或通过行为分析理解P文件的功能。对于较新版本,直接解密的成功率较低,建议结合行为分析和重新实现的方法。

无论使用哪种方法,都应注意可能的法律风险,并仅将这些工具用于合法目的,如恢复自己丢失的源代码或学习研究。

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

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

相关文章

双轮驱动能源革命:能源互联网与分布式能源赋能工厂能效跃迁

在全球能源结构深度转型与“双碳”目标的双重驱动下&#xff0c;工厂作为能源消耗的主力军&#xff0c;正站在节能变革的关键节点。能源互联网与分布式能源技术的融合发展&#xff0c;为工厂节能开辟了全新路径。塔能科技凭借前沿技术与创新实践&#xff0c;深度探索能源协同优…

React 更新 state 中的数组

更新 state 中的数组 数组是另外一种可以存储在 state 中的 JavaScript 对象&#xff0c;它虽然是可变的&#xff0c;但是却应该被视为不可变。同对象一样&#xff0c;当你想要更新存储于 state 中的数组时&#xff0c;你需要创建一个新的数组&#xff08;或者创建一份已有数组…

ubantu18.04HDFS编程实践(Hadoop3.1.3)

说明&#xff1a;本文图片较多&#xff0c;耐心等待加载。&#xff08;建议用电脑&#xff09; 注意所有打开的文件都要记得保存。 第一步&#xff1a;准备工作 本文是在之前Hadoop搭建完集群环境后继续进行的&#xff0c;因此需要读者完成我之前教程的所有操作。 第二步&am…

MySQL快速入门篇---库的操作

目录 一、创建数据库 1.语法 2.示例 二、查看数据库 1.语法 三、字符集编码和校验&#xff08;排序&#xff09;规则 1.查看数据库支持的字符集编码 2.查看数据库支持的排序规则 3.查看系统默认字符集和排序规则 3.1.查看系统默认字符集 3.2.查看系统默认排序规则 ​…

【已更新完毕】2025华中杯B题数学建模网络挑战赛思路代码文章教学:校园共享单车的调度与维护问题

完整内容请看文末最后的推广群 构建校园共享单车的调度与维护问题 摘要 共享单车作为一种便捷、环保的短途出行工具&#xff0c;近年来在高校校园内得到了广泛应用。然而&#xff0c;共享单车的运营也面临一些挑战。某高校引入共享单车后&#xff0c;委托学生对运营情况进行调…

NO.92十六届蓝桥杯备战|图论基础-最小生成树-Prim算法-Kruskal算法|买礼物|繁忙的都市|滑雪(C++)

一个具有n个顶点的连通图&#xff0c;其⽣成树为包含n-1条边和所有顶点的极⼩连通⼦图。对于⽣成树来说&#xff0c;若砍去⼀条边就会使图不连通图&#xff1b;若增加⼀条边就会形成回路。 ⼀个图的⽣成树可能有多个&#xff0c;将所有⽣成树中权值之和最⼩的树称为最⼩⽣成树…

第十四节:实战场景-何实现全局状态管理?

React.createElement调用示例 Babel插件对JSX的转换逻辑 React 全局状态管理实战与 JSX 转换原理深度解析 一、React 全局状态管理实现方案 1. Context API useReducer 方案&#xff08;轻量级首选&#xff09; // 创建全局 Context 对象 const GlobalContext createConte…

数据驱动、精准协同:高端装备制造业三位一体生产管控体系构建

开篇引入 鉴于集团全面推行生产运营体建设以及对二级单位生产过程管控力度逐步加强&#xff0c;某高端装备制造企业生产部长王总正在开展新的一年企业生产管控规划工作&#xff0c;为了能够更好地进行体系规划与建设应用&#xff0c;特邀请智能制造专家小智来进行讨论交流。 王…

航电系统之通信技术篇

航电系统&#xff08;航空电子系统&#xff09;的通信技术是现代航空器的核心技术之一&#xff0c;其核心目标是实现飞行器内部各系统之间以及飞行器与外部设备&#xff08;如地面控制中心、其他飞行器等&#xff09;之间高效、可靠的信息交互。随着航空技术的不断发展&#xf…

发现“横”字手写有难度,对比两个“横”字

我发现手写体“横”字“好看”程度&#xff0c;难以比得上印刷体&#xff1a; 两个从方正简体启体来的“横”字&#xff1a; 哪个更好看&#xff1f;我是倾向于左边一点。 <div style"transform: rotate(180deg); display: inline-block;"> 左边是我从方正简…

深度学习3.1 线性回归

3.1.1 线性回归的基本概念 损失函数 梯度下降 3.1.2 向量化加速 %matplotlib inline import math import time import numpy as np import torch from d2l import torch as d2ln 1000000 #本机为了差距明显&#xff0c;选择数据较大&#xff0c;运行时间较长&#xff0c;可选…

番外篇 | SEAM-YOLO:引入SEAM系列注意力机制,提升遮挡小目标的检测性能

前言:Hello大家好,我是小哥谈。SEAM(Squeeze-and-Excitation Attention Module)系列注意力机制是一种高效的特征增强方法,特别适合处理遮挡和小目标检测问题。该机制通过建模通道间关系来自适应地重新校准通道特征响应。在遮挡小目标检测中的应用优势包括:1)通道注意力增强…

SpringBoot ApplicationEvent:事件发布与监听机制

文章目录 引言一、事件机制的基本概念二、创建自定义事件2.1 定义事件类2.2 发布事件2.3 简化的事件发布 三、创建事件监听器3.1 使用EventListener注解3.2 实现ApplicationListener接口3.3 监听非ApplicationEvent类型的事件 四、事件监听的高级特性4.1 条件事件监听4.2 异步事…

广东2024信息安全管理与评估一阶段答案截图

2023-2024 学年广东省职业院校技能大赛 高等职业教育组 信息安全管理与评估 赛题一 模块一 网络平台搭建与设备安全防护 一、 比赛时间 本阶段比赛时间为 180 分钟。 二、 赛项信息 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第一…

安卓手机如何改ip地址教程

对于安卓手机用户而言&#xff0c;ip修改用在电商、跨境电商、游戏搬砖、社交软件这些需要开多个账号的项目。因为多个设备或账号又不能在同一ip网络下&#xff0c;所以修改手机的IP地址防检测成为一个必要的操作。以下是在安卓手机上更改IP地址的多种方法及详细步骤&#xff0…

(51单片机)LCD显示数据存储(DS1302时钟模块教学)(LCD1602教程)(独立按键教程)(延时函数教程)(I2C总线认识)(AT24C02认识)

目录 演示视频&#xff1a; 源代码 main.c LCD1602.c LCD1602.h AT24C02.c AT24C02.h Key.c Key.h I2C.c I2C.h Delay.c Delay.h 代码解析与教程&#xff1a; Dealy模块 LCD1602模块 Key模块 I2C总线模块 AT24C02模块 /E2PROM模块 main模块 演示视频&#xff1a; &…

STL简介 + string【上】

一 . STL简介 1.1 什么是STL STL&#xff08;standard template libaray - 标准模板库) : 是C标准库的重要组成部分 &#xff0c; 不仅是一个可复用的组件库 &#xff0c; 而且是一个包罗 数据结构 与 算法 的软件框架 。 注意 &#xff1a; 是标准库的一部分 &#xff…

【Bluedroid】A2DP Sink播放流程源码分析(二)

接上一篇继续分析:【Bluedroid】A2DP Sink播放流程源码分析(一)_安卓a2dp sink播放流程-CSDN博客 AVDTP接收端(Sink)流事件处理 bta_av_sink_data_cback 是 Bluedroid 中 A2DP Sink 角色的 AVDTP 数据回调函数,负责处理接收端的音频数据事件,将底层接收到的音频数据传递…

redis利用备忘录

fofa: icon_hash"864611937" 防护&#xff1a; redis的安全设置&#xff1a;设置完毕&#xff0c;需要重加载配置文件启动redis 1.绑定内网ip地址进行访问 2. requirepass设置redis密码 3.保护模式开启protected-mode开启&#xff08;默认开启&#xff09; 4.最好把…

SAP系统中MD01与MD02区别

知识点普及&#xff0d;MD01与MD02区别 1、从日常业务中&#xff0c;我们都容易知道MD01是运行全部物料&#xff0c;MD02是运行单个物料 2、在做配置测试中&#xff0c;也出现过MD02可以跑出物料&#xff0c;但是MD01跑不出的情况。 3、MD01与MD02的差异: 3.1、只要在物料主数…