关于使用pyasn1实现RFC7906的KeyPurpose枚举类型及十六进制编码转十进制值的技术咨询
使用pyasn1实现RFC7906的KeyPurpose枚举类型及十六进制编码转十进制值的技术咨询
嘿,我来帮你搞定用pyasn1实现RFC7906里的KeyPurpose枚举类型的问题!刚好我对pyasn1的枚举实现挺熟的,给你一步步拆解。
首先,我们需要基于pyasn1的univ.Enumerated类来定义这个KeyPurpose类型,把RFC里规定的所有枚举项和对应的数值都精准对应上。直接上代码,这样更直观:
from pyasn1.type import univ from pyasn1.codec.ber import encoder, decoder # 严格按照RFC7906定义KeyPurpose枚举类型 class KeyPurpose(univ.Enumerated): namedValues = univ.Enumerated.namedValues.clone( ('n-a', 0), # Not Applicable ('A', 65), # Operational ('B', 66), # Compatible Multiple Key ('L', 76), # Logistics Combinations ('M', 77), # Maintenance ('R', 82), # Reference ('S', 83), # Sample ('T', 84), # Training ('V', 86), # Developmental ('X', 88), # Exercise ('Z', 90) )
接下来给你几个实用的使用场景示例,覆盖枚举实例创建、ASN.1编解码,还有你可能需要的十六进制转十进制处理:
1. 创建枚举实例并映射数值/名称
# 通过枚举名称创建实例 kp_operational = KeyPurpose('A') print(f"枚举项'A'对应的数值是: {kp_operational}") # 输出65 # 通过数值创建实例,并反向获取名称 kp_logistics = KeyPurpose(76) print(f"数值76对应的枚举项是: {kp_logistics.namedValue}") # 输出'L'
2. ASN.1 BER编码与解码
如果需要把枚举值转换成ASN.1标准的BER编码,或者把收到的BER编码数据解析成枚举值,用pyasn1自带的编解码器就能轻松搞定:
# 把枚举实例编码为BER格式 encoded_data = encoder.encode(kp_operational) print(f"BER编码后的十六进制字符串: {encoded_data.hex()}") # 输出类似"0a0141" # 解码十六进制格式的BER数据 hex_encoded_str = "0a0141" decoded_kp, _ = decoder.decode(bytes.fromhex(hex_encoded_str), asn1Spec=KeyPurpose()) print(f"解码后的枚举项: {decoded_kp.namedValue}") # 输出'A'
3. 十六进制值转十进制(对应枚举数值)
如果拿到的是枚举数值的十六进制表示(比如0x41对应'A'的65),用Python内置的int()函数就能快速转换:
hex_str = "41" decimal_val = int(hex_str, 16) print(f"十六进制{hex_str}转十进制为: {decimal_val}") # 输出65 # 用转换后的十进制值创建枚举实例 kp_from_decimal = KeyPurpose(decimal_val) print(f"对应枚举项: {kp_from_decimal.namedValue}") # 输出'A'
这里要提一句,RFC7906里的字母枚举项对应的数值刚好是它们的ASCII大写字母码值,所以定义的时候直接用这些数值就完全符合规范。后续如果要扩展枚举项,直接在namedValues里追加新的(名称, 数值)对就行。
备注:内容来源于stack exchange,提问作者Andy Mc
相关产品推荐
相关产品推荐

