Python-VBA函数之旅-bytearray函数

目录

1、bytearray函数:

1-1、Python:

1-2、VBA:

2、相关文章:

个人主页:非风V非雨-CSDN博客


        bytearray函数在Python中提供了一种可变字节序列的表示方式,这在实际编程中有多种应用场景。常见的应用场景有:

1、二进制数据处理:当需要处理二进制数据时,bytearray()是一个很好的选择。你可以使用它来存储和操作二进制数据,例如,读取或写入文件、网络通信中的数据包等。

2、内存中的缓冲区:bytearray()可以用作内存中的缓冲区,存储临时数据,并在需要时进行修改或传输。这在处理大量数据或需要频繁修改数据的场景中非常有用。

3、网络编程:在网络编程中,经常需要处理字节流。使用bytearray()可以方便地构建、修改和发送字节数据。

4、图像和视频处理:图像和视频数据通常以字节流的形式存储和传输。使用bytearray()可以方便地读取、修改和保存这些数据的特定部分,例如,修改图像的像素值或视频的编码参数。

5、序列化与反序列化:bytearray()可以用来存储序列化后的数据,如将对象转换为字节流进行存储或传输。反序列化时,可以从bytearray()中读取数据并还原为原始对象。

6、加密与解密:在加密和解密算法中,bytearray()可以用来存储和处理加密数据。你可以使用bytearray()来执行加密操作,并将加密后的数据存储在bytearray()中,或者从bytearray()中读取加密数据进行解密。

7、自定义协议:当实现自定义的通信协议时,bytearray()可以用来构建和解析协议中的字节数据。你可以使用bytearray()来定义协议的数据结构,并根据协议规范进行数据的编码和解码。

        这些只是bytearray()的一些常见应用场景,实际上,在处理与字节序列相关的任何任务时,bytearray()都可以作为一个灵活且强大的工具来使用。它的可变性使得它能够在需要时轻松地进行修改和调整,而不需要创建新的字节序列对象。

1、bytearray函数:
1-1、Python:
# 1.函数:bytearray
# 2.功能:用于处理可变字节序列,即创建可修改的字节数组
# 3.语法:bytearray(source, encoding, errors)
# 4.参数:
# 4-1、source>>>
# 1、整数,包括正整数、0和负整数
# 2、字符串
# 3、可迭代对象,包括但不限于以下类型:
# 3-1、序列类型:
        # list(列表):有序的元素集合
        # tuple(元组):不可变的有序的元素集合
        # str(字符串):字符的有序集合
        # bytes(字节序列):字节的有序集合
        # bytearray(可变字节序列):可变的字节的有序集合
        # range(范围对象):表示一个不可变的整数序列
        # memoryview(内存视图):用于在不需要复制数据的情况下访问对象的内存
# 3-2、集合类型:
        # set(集合):无序且不包含重复元素的集合
        # frozenset(冻结集合):不可变的无序且不包含重复元素的集合
# 3-3、字典与字典视图:
        # dict(字典):无序的键值对集合
        # dict的keys()、values()、items()方法返回的视图对象
# 3-4、文件对象:
        # 打开的文件对象也是可迭代的,可以通过迭代逐行读取文件内容
# 3-5、自定义可迭代对象:
        # 任何定义了__iter__()方法的对象都可以被视为可迭代对象。这个方法应该返回一个迭代器对象
# 3-6、生成器:
        # 生成器函数和生成器表达式创建的生成器对象也是可迭代的
# 3-7、其他内置类型:
        # 某些内置的数据类型或函数返回的对象也可能是可迭代的,比如map、filter、zip等函数返回的对象
# 4-2、encoding>>>表示进行转换时采用的字符编码,默认为UTF-8编码
# 4-3、errors>>>表示错误处理方式(报错级别),常见的报错级别有:
# 1、strict:严格级别(默认级别),字符编码有报错时即抛出异常
# 2、ignore:忽略级别,字符编码有报错,忽略掉
# 3、replace:替换级别,字符编码有报错,替换成符号“?”
# 5.返回值:返回一个新的字节数组(若3个参数均未提供,则返回长度为0的字节数组)
# 6.说明:
# 6-1、如果参数source为字符串,那么参数encoding也必须提供,否则将提示TypeError错误。详情如下:
       # TypeError: string argument without an encoding
       # print(bytearray("myelsa"))
# 6-2、如果参数source为可迭代对象,那么可迭代对象的元素必须为0-255的范围内的整数,否则将抛出异常。详情如下:
       # ValueError: byte must be in range(0, 256)
       # print(bytearray([1024, 8, 6]))
       # TypeError: 'float' object cannot be interpreted as an integer
       # print(bytearray([3.14, 1.5, 6.0]))
# 6-3、bytearray()函数与bytes()函数的主要区别:前者产生的对象元素可以修改,而后者不能修改
# 7.示例:
# 应用1:二进制数据处理(增、删、改、查等操作)
# 初始化bytearray
data = bytearray([0x01, 0x02, 0x03, 0x04, 0x05])
# 打印原始数据
print("原始数据:", data)
# 增加数据
data.append(0x06)
print("增加数据后的数据:", data)
# 删除数据
del data[2]
print("删除数据后的数据:", data)
# 修改数据
data[3] = 0x07
print("修改数据后的数据:", data)
# 查找数据
index = data.find(0x04)
if index != -1:
    print("找到数据0x04的索引为:", index)
else:
    print("未找到数据0x04")
# 增加数据后的数据: bytearray(b'\x01\x02\x03\x04\x05\x06')
# 删除数据后的数据: bytearray(b'\x01\x02\x04\x05\x06')
# 修改数据后的数据: bytearray(b'\x01\x02\x04\x07\x06')
# 找到数据0x04的索引为: 2

# 应用2:内存中的缓冲区(包括初始化、写入数据、读取数据、修改数据、追加数据、切片操作以及清空缓冲区)
# 创建一个bytearray作为内存缓冲区
buffer = bytearray(10)  # 初始化一个大小为10的内存缓冲区
# 向内存缓冲区中写入数据
buffer[0] = 1  # 写入一个字节
buffer[1] = 2
buffer[2:5] = [3, 4, 5]  # 写入多个字节
# 打印缓冲区的内容
print("缓冲区内容:", buffer)
# 读取缓冲区中的数据
first_byte = buffer[0]
print("第一个字节:", first_byte)
# 修改缓冲区中的数据
buffer[3] = 6
print("修改后的缓冲区内容:", buffer)
# 在缓冲区中追加数据
buffer.extend([7, 8, 9])
print("追加数据后的缓冲区内容:", buffer)
# 缓冲区切片操作
sub_buffer = buffer[2:7]  # 获取一个子缓冲区
print("子缓冲区内容:", sub_buffer)
# 缓冲区大小
print("缓冲区大小:", len(buffer))
# 清空缓冲区
del buffer[:]
print("清空后的缓冲区内容:", buffer)
# 缓冲区内容: bytearray(b'\x01\x02\x03\x04\x05\x00\x00\x00\x00\x00')
# 第一个字节: 1
# 修改后的缓冲区内容: bytearray(b'\x01\x02\x03\x06\x05\x00\x00\x00\x00\x00')
# 追加数据后的缓冲区内容: bytearray(b'\x01\x02\x03\x06\x05\x00\x00\x00\x00\x00\x07\x08\t')
# 子缓冲区内容: bytearray(b'\x03\x06\x05\x00\x00')
# 缓冲区大小: 13
# 清空后的缓冲区内容: bytearray(b'')

# 应用3:网络编程
import socket
# 创建TCP客户端
def create_tcp_client(server_address, port):
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client_socket.connect((server_address, port))
    return client_socket
# 构建二进制消息
def build_message(data):
    # 假设我们有一个简单的协议,其中每个消息都以一个长度字节开始
    length = len(data).to_bytes(1, byteorder='big')
    message = bytearray(length) + bytearray(data, 'utf-8')
    return message
# 解析二进制消息
def parse_message(message):
    # 假设消息的第一个字节是长度
    length = message[0]
    data = message[1:length + 1].decode('utf-8')
    return data
# 发送消息并接收响应
def send_receive_message(client_socket, message):
    client_socket.sendall(message)
    response = client_socket.recv(4096)  # 假设响应不会超过4096字节
    return response
# 主函数
if __name__ == "__main__":
    SERVER_ADDRESS = 'localhost'
    PORT = 12345
    MESSAGE = "Hello, Python!"
    # 创建TCP客户端
    client_socket = create_tcp_client(SERVER_ADDRESS, PORT)
    # 构建二进制消息
    binary_message = build_message(MESSAGE)
    # 发送消息并接收响应
    response = send_receive_message(client_socket, binary_message)
    # 解析响应
    response_data = parse_message(response)
    # 打印响应
    print("Received response:", response_data)
    # 关闭连接
    client_socket.close()

# 应用4:图像和视频处理(注意:运行此程序,需要确保已经安装了pillow库)
from PIL import Image
import io
# 读取图像文件到bytearray
def read_image_to_bytearray(image_path):
    with open(image_path, 'rb') as file:
        byte_data = bytearray(file.read())
    return byte_data
# 将bytearray写回到图像文件
def write_bytearray_to_image(byte_data, output_path):
    with open(output_path, 'wb') as file:
        file.write(byte_data)
# 读取图像并显示
def display_image(image_path):
    image = Image.open(image_path)
    image.show()
# 主函数
if __name__ == "__main__":
    # 使用原始字符串或双反斜杠来处理Windows文件路径
    input_image_path = r'E:\python_workspace\pythonProject\input.jpg'
    output_image_path = r'E:\python_workspace\pythonProject\output.jpg'
    try:
        # 读取图像到bytearray
        image_bytearray = read_image_to_bytearray(input_image_path)
        # 显示原始图像
        display_image(input_image_path)
        # 将bytearray写回到新的图像文件
        write_bytearray_to_image(image_bytearray, output_image_path)
        # 显示从bytearray写回的图像,以验证内容是否正确
        display_image(output_image_path)
    except Exception as e:
        print(f"An error occurred: {e}")

# 应用5:序列化与反序列化
import struct
def serialize_integers(integers):
    # 创建一个空的bytearray
    byte_data = bytearray()
    # 将每个整数转换为4字节的二进制数据并添加到bytearray中
    for integer in integers:
        # 使用struct来将整数打包为4字节的二进制数据
        packed_integer = struct.pack('i', integer)
        byte_data.extend(packed_integer)
    return byte_data
def deserialize_integers(byte_data):
    integers = []
    # 以4字节为单位从bytearray中读取数据,并解包为整数
    while byte_data:
        # 使用struct来将4字节的二进制数据解包为整数
        unpacked_integer = struct.unpack('i', byte_data[:4])[0]
        integers.append(unpacked_integer)
        # 移除已处理的4字节数据
        byte_data = byte_data[4:]
    return integers
# 主函数
if __name__ == '__main__':
    # 用于序列化与反序列化整数列表
    original_integers = [3, 5, 6, 8, 10, 11, 24]
    # 序列化整数列表为bytearray
    serialized_data = serialize_integers(original_integers)
    print("Serialized bytearray:", serialized_data)
    # 反序列化bytearray为整数列表
    deserialized_integers = deserialize_integers(serialized_data)
    print("Deserialized integers:", deserialized_integers)
    # 验证反序列化后的数据是否与原始数据相同
    assert original_integers == deserialized_integers
    print("Serialization and deserialization successful!")
# Serialized bytearray: bytearray(b'\x03\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\x08\x00\x00\x00\n\x00\x00\x00\x0b\x00\x00\x00\x18\x00\x00\x00')
# Deserialized integers: [3, 5, 6, 8, 10, 11, 24]
# Serialization and deserialization successful!

# 应用6:加密与解密(注意:运行此程序,需确保已经安装了加密算法库pycryptodome)
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
from Crypto.Random import get_random_bytes
def encrypt_data(key, plaintext):
    # AES加密要求密钥长度为16(AES128)、24(AES192)或32(AES256)字节
    # 如果密钥长度不足,可以通过某种方式(如哈希函数)扩展它
    # 这里我们假设key已经是合适的长度
    cipher = AES.new(key, AES.MODE_CBC)
    # 对明文进行填充,使其长度为16的倍数
    padded_plaintext = pad(plaintext, AES.block_size)
    # 加密填充后的明文
    ciphertext = cipher.encrypt(padded_plaintext)
    # 获取初始化向量(IV),它用于CBC模式
    iv = cipher.iv
    # 返回IV和密文,通常将它们拼接在一起
    return iv + ciphertext
def decrypt_data(key, encrypted_data):
    # 分离IV和密文
    iv = encrypted_data[:AES.block_size]
    ciphertext = encrypted_data[AES.block_size:]
    # 使用相同的IV和密钥创建解密器
    cipher = AES.new(key, AES.MODE_CBC, iv=iv)
    # 解密密文
    decrypted_padded_text = cipher.decrypt(ciphertext)
    # 去除填充
    decrypted_text = unpad(decrypted_padded_text, AES.block_size)
    return decrypted_text
# 主函数
if __name__ == '__main__':
    key = get_random_bytes(16)  # 生成一个随机的16字节AES密钥
    plaintext = b"I love python very much"  # 明文消息,必须是bytes类型
    # 加密
    encrypted_data = encrypt_data(key, plaintext)
    print("Encrypted data:", encrypted_data)
    # 解密
    decrypted_text = decrypt_data(key, encrypted_data)
    print("Decrypted text:", decrypted_text)
    # 验证解密后的文本是否与原始明文相同
    assert plaintext == decrypted_text
    print("Encryption and decryption successful!")
# Encrypted data: b'\x0f`\xdd\x95\x1bA\x1d.\xc7\x1d\xb6\xa1<60\xbf\xac\x99\x86\x92\x08\xc6@\xa5\x0c\xcc\x96\x00L>\x8f\x95\x03\xc5P\x8d\x11\xd0=\x14\xf6\xa5p\xf8\xc4\x141o'
# Decrypted text: b'I love python very much'
# Encryption and decryption successful!

# 应用7:自定义协议
def encode_message(data):
    # 将数据编码为字节
    data_bytes = data.encode('utf-8')
    # 计算消息长度,并转换为4字节的整数表示(如果需要支持更长的消息,应增加字节数)
    length = len(data_bytes).to_bytes(4, 'big')
    # 构建完整的消息:消息头(长度)+ 消息体
    message = bytearray(length) + bytearray(data_bytes)
    return message
def decode_message(message_bytes):
    # 检查消息长度是否至少为4字节(消息头长度)
    if len(message_bytes) < 4:
        raise ValueError("消息太短,无法包含有效的标头!")
    # 提取消息头中的长度信息
    length = int.from_bytes(message_bytes[:4], 'big')
    # 检查消息体长度是否与头部指定的长度一致
    if len(message_bytes) != 4 + length:
        raise ValueError("消息正文长度与标头中指定的长度不匹配!")
    # 提取消息体
    data_bytes = message_bytes[4:4 + length]
    # 将字节解码为字符串
    data = data_bytes.decode('utf-8')
    return data
# 主函数
if __name__ == '__main__':
    # 编码和解码消息
    original_data = "Hello, Python!"
    encoded_message = encode_message(original_data)
    print("Encoded message:", encoded_message)
    decoded_data = decode_message(encoded_message)
    print("Decoded data:", decoded_data)
    # 验证解码后的数据是否与原始数据相同
    assert original_data == decoded_data
    print("Encoding and decoding successful!")
# Encoded message: bytearray(b'\x00\x00\x00\x0eHello, Python!')
# Decoded data: Hello, Python!
# Encoding and decoding successful!
1-2、VBA:
Rem 模拟Python中bytearray函数应用2:内存中的缓冲区(包括初始化、写入数据、读取数据、修改数据、追加数据、切片操作以及清空缓冲区)
Sub TestRun_1()
    Dim buffer() As Byte
    Dim n As Byte, m As Byte
    Dim first_byte As Byte
    Dim sub_buffer() As Byte
    Dim i As Integer
    Dim j As Integer
      
    ' 初始化大小为10的缓冲区(索引从0到9)
    ReDim buffer(9)
      
    ' 填充缓冲区的前5个字节
    For n = 0 To 4
        buffer(n) = n + 1
    Next n
      
    ' 打印缓冲区内容
    Debug.Print "缓冲区内容:"
    For i = LBound(buffer) To UBound(buffer)
        If buffer(i) <> 0 Then
            Debug.Print Hex(buffer(i)),
        End If
    Next i
    Debug.Print
      
    ' 读取第一个字节
    first_byte = buffer(0)
    Debug.Print "第一个字节:", Hex(first_byte)
      
    ' 修改缓冲区的第4个字节
    buffer(3) = 6
      
    ' 打印修改后的缓冲区内容
    Debug.Print "修改后的缓冲区内容:"
    For i = LBound(buffer) To UBound(buffer)
        If buffer(i) <> 0 Then
            Debug.Print Hex(buffer(i)),
        End If
    Next i
    Debug.Print
      
    ' 在缓冲区末尾追加3个字节
    ReDim Preserve buffer(UBound(buffer) + 2)
    buffer(UBound(buffer) - 2) = 7
    buffer(UBound(buffer) - 1) = 8
    buffer(UBound(buffer)) = 9
    Next
      
    ' 打印追加数据后的缓冲区内容
    Debug.Print "追加数据后的缓冲区内容:"
    For i = LBound(buffer) To UBound(buffer)
        If buffer(i) <> 0 Then
            Debug.Print Hex(buffer(i)),
        End If
    Next i
    Debug.Print
      
    ' 创建子缓冲区并复制指定范围的数据
    ReDim sub_buffer(UBound(buffer) - LBound(buffer) - 3)
    j = 0
    For i = 2 To 5
        sub_buffer(j) = buffer(i)
        j = j + 1
    Next i
      
    ' 打印子缓冲区内容
    Debug.Print "子缓冲区内容:"
    For i = LBound(sub_buffer) To UBound(sub_buffer)
        Debug.Print Hex(sub_buffer(i)),
    Next i
    Debug.Print
      
    ' 打印缓冲区大小
    Debug.Print "缓冲区大小:", UBound(buffer) - LBound(buffer) + 1
      
    ' 清空缓冲区
    ReDim buffer(0)
      
    ' 打印清空后的缓冲区内容(实际上为空,无需循环打印)
    Debug.Print "清空后的缓冲区内容:"
End Sub
'缓冲区内容:
'1             2             3             4             5
'第一个字节:   1
'修改后的缓冲区内容:
'1             2             3             6             5
'追加数据后的缓冲区内容:
'1             2             3             6             5             7             8             9
'子缓冲区内容:
'3             6             5             0             0             0             0             0             0
'缓冲区大小:    12
'清空后的缓冲区内容:
'

注意:1-2中的代码需粘贴到你的VBA编辑器中,按F5执行对应的Sub程序即可输出结果。 

2、相关文章:

2-1、Python-VBA函数之旅-all()函数 

2-2、Python-VBA函数之旅-any()函数 

2-3、Python-VBA函数之旅-ascii()函数 

2-4、 Python-VBA函数之旅-bin()函数

Python算法之旅:Algorithm

Python函数之旅:Function

个人主页:非风V非雨-CSDN博客

欢迎志同道合者一起交流学习,我的QQ:94509325/微信:

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

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

相关文章

基于springboot+vue+Mysql的职称评审管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

Web 前端性能优化之八:前端性能检测实践

五、前端性能检测实践 1、常用的检测工具 Lighthouse、Chrome开发者工具中与性能检测相关的一些工具面板、页面加载性能分析工具PageSpeed Insights、专业的性能检测工具WEBPAGETEST等 1、Chrome 任务管理器 通过Chrome任务管理器我们可以查看当前Chrome浏览器中&#xff0…

机器学习-08-关联规则和协同过滤

总结 本系列是机器学习课程的系列课程&#xff0c;主要介绍机器学习中关联规则和协同过滤。 参考 机器学习&#xff08;三&#xff09;&#xff1a;Apriori算法&#xff08;算法精讲&#xff09; Apriori 算法 理论 重点 MovieLens:一个常用的电影推荐系统领域的数据集 2…

苍穹外卖---文件上传-阿里OSS

一&#xff1a;开通阿里云对象存储服务oss,创建bucket&#xff0c;获得密钥 二&#xff1a;在程序中集成上传文件功能 1.连接阿里云OSS对象存储服务器 声明一个配置属性的文件用于传入连接的参数 package com.sky.properties;import lombok.Data; import org.springframewo…

three.js跟着教程实现VR效果(四)

参照教程&#xff1a;https://juejin.cn/post/6973865268426571784&#xff08;作者&#xff1a;大帅老猿&#xff09; 1.WebGD3D引擎 用three.js &#xff08;1&#xff09;使用立方体6面图 camera放到 立方体的中间 like “回” 让贴图向内翻转 &#xff08;2&#xff09;使…

每周一算法:树上差分

题目链接 闇の連鎖 题目描述 传说中的暗之连锁被人们称为Dark。 Dark是人类内心的黑暗的产物&#xff0c;古今中外的勇者们都试图打倒它。 经过研究&#xff0c;你发现Dark呈现无向图的结构&#xff0c;图中有 N N N个节点和两类边&#xff0c;一类边被称为主要边&#xf…

用Python编写GUI程序实现WebP文件批量转换为JPEG格式

在Python编程中&#xff0c;经常会遇到需要处理图片格式的情况。最近&#xff0c;我遇到了一个有趣的问题&#xff1a;如何通过编写一个GUI程序来实现将WebP格式的图片批量转换为JPEG格式&#xff1f;在这篇博客中&#xff0c;我将分享我使用Python、wxPython模块和Pillow库实现…

打开Visual Studio后出现Visual Assist报错弹窗

安装了新的VA插件后发现无论如何清理打开VS都会报这个旧版VA报错弹窗&#xff0c;修复VS、重装VA都解决不了 后来进到VS安装目录&#xff0c;删掉一个可疑文件后弹窗再也不出现了

光伏电站运维管理平台功能分析

光伏电站的建设发展&#xff0c;不仅可以满足人们日益增长的用电需求&#xff0c;同时对于减少能源资源消耗也有着十分重要的作用。但是光伏电站因为区域跨度大&#xff0c;分布广泛等原因在建设发展中导致了人员管理困难、运维工作落实不到等问题&#xff0c;直接影响光伏电站…

【随笔】Git 高级篇 -- 相对引用1 main^(十二)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

python用循环新建多个列表

​在Python编程中&#xff0c;我们经常需要创建多个列表来存储和管理数据。有时候&#xff0c;列表的数量是已知的&#xff0c;我们可以手动逐一创建&#xff1b;但更多时候&#xff0c;列表的数量是动态的&#xff0c;或者我们希望通过某种模式来批量生成列表。这时候&#xf…

对称加密学习

对称加密是一种加密技术&#xff0c;它使用相同的密钥进行数据的加密和解密操作。这种加密方法因其高效性和速度优势&#xff0c;在数据加密领域得到了广泛的应用。 下面是两篇文章&#xff1a; AES加密学习-CSDN博客 加密算法学习-CSDN博客 推荐关注加密专栏&#xff1a; …

HDLbits 刷题 --Exams/m2014 q4g

Implement the following circuit: 实现以下电路 module top_module (input in1,input in2,input in3,output out);assign out (~(in1^in2))^in3; endmodule运行结果&#xff1a; 分析&#xff1a; 同或&#xff1a; out ~(in1 ^ in2); 异或取反 异或&#xff1a; out in1…

【设计模式】笔记篇

目录标题 OO设计原则策略模式 - Strategy定义案例分析需求思路分析核心代码展示进一步优化UML 图 观察者模式 - Observe定义案例分析需求UML图内置的Java观察者模式核心代码 总结 装饰者模式 - Decorator定义案例分析需求UML图分析核心代码 总结 工厂模式 - Abstract Method/Fa…

素人小红书发布如何选择账号?

如何从众多账号中筛选出符合品牌或产品特性、具有高性价比和合作潜力的账号&#xff0c;成为了许多品牌和营销人士关注的焦点。素人小红书发布如何选择账号&#xff1f;接下来伯乐网络传媒就来给大家分享一下&#xff0c;希望能为你在小红书上进行账号选择提供一些有价值的参考…

docker部署postgresql数据库和整合springboot连接数据源

公司想要把部分sqlserver的旧服务迁移到PG数据库&#xff0c;先写一个示例的demo&#xff0c;需要用docker部署postgresql数据库和整合springboot连接数据源 安装 下载最新镜像 docker pull postgres创建并且启动容器 docker run -it --name postgres --restart always -e …

嵌入式应会的模电数电基础

AC/DC交直流 电压 欧姆定律 常见元器件 电阻器 并联电阻&#xff0c;增加通路&#xff0c;电阻更小&#xff0c;电流更大 串联电阻&#xff0c;电阻更大&#xff0c;电流越小 相同阻值的电阻&#xff0c;个头大小不同主要区别在功率容量、耐压能力和散热性能方面。 功率容量…

【STL】priority_queue的底层原理及其实现

文章目录 priority_queue的介绍库中priority_queue的使用什么叫仿函数&#xff1f; 模拟实现prioprity_queue类 priority_queue的介绍 解释以上内容 priority_queue&#xff08;优先级队列&#xff09;跟stack、queue一样&#xff0c;都是一种容器适配器&#xff0c;根据严格的…

SpringBoot中定时任务踩坑,@Scheduled重复执行问题排查(看完直接破防)

前言 今天再开发业务需求的过程中&#xff0c;需要用到定时任务&#xff0c;原本定的是每10分钟推送一次&#xff0c;可是当每次十分钟到的时候&#xff0c;定时任务就会推送多条&#xff01;但是非常奇怪的是&#xff0c;本地调试的时候不会有问题&#xff0c;只有当你部署到…

OpenCV | 图像读取与显示

OpenCV 对图像进行处理时&#xff0c;常用API如下&#xff1a; API描述cv.imread根据给定的磁盘路径加载对应的图像&#xff0c;默认使用BGR方式加载cv.imshow展示图像cv.imwrite将图像保存到磁盘中cv.waitKey暂停一段时间&#xff0c;接受键盘输出后&#xff0c;继续执行程序…