Python中如何识别SCHC规则中整数的十六/十进制原始格式?
解决Python中保留整数原始十进制/十六进制格式的问题
我完全懂你的困扰——Python的整数对象本身根本不会记录它是用十进制还是十六进制字面量定义的,一旦赋值完成,它就只是个纯粹的数值而已。要保留原始的格式信息,你得换一种存储方式,这里有几个实用的方案:
方案一:用字符串存储原始格式,按需转换为整数
直接把规则里的tv字段写成字符串形式,这样读取时就能直接拿到原始的写法,需要计算的时候再用int()转换(int(tv, 0)可以自动识别十进制和十六进制)。
修改后的规则示例:
rule = {"ruleid" : 0, "content" : [ ["IPv6.version", 1, "bi", "6", "equal", "not-sent"], ["IPv6.trafficClass", 1, "bi", "0x00", "equal", "not-sent"], ["IPv6.flowLabel", 1, "bi", "0x000000", "ignore", "not-sent"], ["IPv6.payloadLength",1, "bi", None, "ignore", "compute-length"], ["IPv6.nextHeader", 1, "bi", "17", "equal", "not-sent"], ["IPv6.hopLimit", 1, "bi", "30", "equal", "not-sent"], ["IPv6.prefixES", 1, "bi", "0x200104701f1209f2", "equal", "not-sent"], # ... 剩余字段按此格式修改 ]}
处理代码示例:
for line in rule['content']: fID, pos, di, tv, mo, cda = line if tv is not None and isinstance(tv, str): # 转换为可计算的整数(自动识别进制) tv_value = int(tv, 0) # 原始格式直接取tv字符串即可 print(f"原始格式: {tv}, 对应数值: {tv_value}")
方案二:自定义类包装整数,同时保留原始表示
如果需要在代码中频繁使用数值计算,又要随时能获取原始格式,可以创建一个简单的包装类,把原始字符串和数值绑定在一起。
自定义类示例:
class FormattedInt: def __init__(self, original_str): self.original_str = original_str self.value = int(original_str, 0) def __repr__(self): # 打印时直接显示原始格式 return self.original_str # 用FormattedInt实例替换规则里的原生整数 rule = {"ruleid" : 0, "content" : [ ["IPv6.version", 1, "bi", FormattedInt("6"), "equal", "not-sent"], ["IPv6.trafficClass", 1, "bi", FormattedInt("0x00"), "equal", "not-sent"], ["IPv6.prefixES", 1, "bi", FormattedInt("0x200104701f1209f2"), "equal", "not-sent"], ["IPv6.hopLimit", 1, "bi", FormattedInt("30"), "equal", "not-sent"], # ... 剩余字段按此格式修改 ]}
处理代码示例:
for line in rule['content']: fID, pos, di, tv, mo, cda = line if isinstance(tv, FormattedInt): print(f"原始格式: {tv.original_str}") # 计算时直接用tv.value即可,比如: # if tv.value == some_other_value: # do_something()
方案三:从外部配置文件加载时保留格式
如果你的规则不是硬编码在Python代码里,而是从JSON/YAML等配置文件加载的,那可以直接把所有数值存为字符串格式,加载后就能直接获取原始写法,需要计算时再转换。比如用YAML配置的话,还能利用它对不同进制整数的原生支持(不过还是推荐存字符串更稳妥)。
内容的提问来源于stack exchange,提问作者Jorge Peris
相关产品推荐
相关产品推荐

