如何使用Python从含十六进制值的混合数据中提取字符串
混合十六进制与字符串内容的数据集提取字符串的Python实现
以下针对两种常见的数据集存储场景给出对应实现:
场景1:数据集元素为字符串类型,混合普通可读字符串与十六进制编码串
该场景下部分元素是十六进制编码的字符串(例如"48656c6c6f"对应"Hello"、带前缀的"0x707974686f6e"对应"python"),部分是直接可读的普通字符串。
实现代码:
def extract_str_from_mixed_str(mixed_item: str, encoding: str = "utf-8") -> str: # 清洗十六进制串的多余格式:移除首尾空格、小写、去掉0x前缀 cleaned_item = mixed_item.strip().lower().removeprefix("0x") # 校验是否为合法十六进制串:长度为偶数,所有字符均为十六进制字符 if len(cleaned_item) % 2 == 0 and all(c in "0123456789abcdef" for c in cleaned_item): try: # 十六进制转字节后解码为目标字符串 return bytes.fromhex(cleaned_item).decode(encoding) except UnicodeDecodeError: # 解码失败说明不是有效字符串的十六进制编码,返回原内容 return mixed_item # 非十六进制串直接返回原内容 return mixed_item # 调用示例 dataset = ["48656c6c6f", "普通字符串", "0x707974686f6e", "6874747073"] processed_dataset = [extract_str_from_mixed_str(item) for item in dataset] print(processed_dataset) # 输出:['Hello', '普通字符串', 'python', 'https']
注:如果你的十六进制内容使用非UTF-8编码(比如GBK、Latin-1),修改encoding参数即可
场景2:数据集为原始bytes二进制流,混合可打印字符串与十六进制字节
该场景下你拿到的是二进制数据(例如从日志文件、网络抓包、二进制文件读取的内容),需要从中提取所有连续的可打印字符串。
实现代码:
import string def extract_str_from_bytes(raw_bytes: bytes, min_str_length: int = 4) -> list[str]: # 定义可打印字符集合 printable = set(bytes(string.printable, "ascii")) current_str = [] result = [] for b in raw_bytes: if b in printable: current_str.append(chr(b)) else: # 遇到不可打印字符时,判断当前累计的字符串长度是否符合要求 if len(current_str) >= min_str_length: result.append("".join(current_str)) current_str = [] # 处理数据流末尾剩余的可打印字符 if len(current_str) >= min_str_length: result.append("".join(current_str)) return result # 调用示例 raw_data = b"\x00\x01Hello\x02\x03World\x04\x00test123\x05\x06" extracted_strs = extract_str_from_bytes(raw_data) print(extracted_strs) # 输出:['Hello', 'World', 'test123']
注:min_str_length参数用于过滤过短的零散可打印字符,可根据需求调整
内容的提问来源于stack exchange,提问作者Iqrar Ijaz
相关产品推荐
相关产品推荐

