import math import hashlib import os import json import re import asyncio def get_bit_mask(start, end): bits = math.ceil((end + 1) / 8) * 8 if bits == 0: bits = 8 mask = 0 for i in range(start, end + 1): mask |= 1 << (bits - i - 1) return mask def generate_text_md5(input_string): # 创建一个 md5 哈希对象 md5_hash = hashlib.md5() # 更新哈希对象的内容(需要将字符串编码为字节) md5_hash.update(input_string.encode('utf-8')) # 获取哈希值的十六进制表示 md5_digest = md5_hash.hexdigest() return md5_digest def generate_bytes_md5(input_bytes): # 创建一个 md5 哈希对象 md5_hash = hashlib.md5() # 更新哈希对象内容 md5_hash.update(input_bytes) # 获取哈希值的十六进制表示 md5_digest = md5_hash.hexdigest() return md5_digest async def get_md5_async(file: bytes): md5 = await asyncio.to_thread(generate_bytes_md5, file) return md5 async def save_to_file_async(data: bytes, file_path: str): await asyncio.to_thread(save_bytes_to_file, data, file_path) def file_exists(cache_file: str): return os.path.exists(cache_file) def read_from_file(file: str) -> str: with open(file, 'r', encoding='utf-8') as f: text = f.read() return text def save_text_to_file(text: str, file: str): with open(file, 'w', encoding='utf-8') as f: f.write(text) def save_bytes_to_file(bytes_data: bytes, file: str): with open(file, 'wb') as f: f.write(bytes_data) def replace_tpl_paras(tpl_text: str, data: dict): for key, val in data.items(): if not isinstance(val, str): val = json.dumps(json.dumps(val, ensure_ascii=False), ensure_ascii=False)[1:-1] tpl_text = tpl_text.replace('{{' + key + '}}', val) return tpl_text def to_file_name(text: str): """ 将文本转为合法的文件名称。 将特殊字符替换为_ :param text: :return: """ return re.sub(r'[\t\\/:*?"<>|]', '_', text)