Python 2.7字符串十六进制XOR校验和输出补零问题求助
解决Python 2.7中十六进制XOR校验和的前导零缺失问题
你遇到的问题很典型:当XOR结果小于16(即十六进制的0x10)时,hex()函数会返回不带前导零的单字符字符串,比如0x02会变成'0x2',去掉0x后就只剩'2'了。
最佳解决方案:使用字符串格式化直接生成两位十六进制字符串
比起用.zfill(2)补零,更可靠且简洁的方式是用Python的字符串格式化操作,一步到位生成固定两位的十六进制结果,自动处理前导零的问题。
修改你的函数如下:
def getCheckSum(sentence): calc_cksum = 0 for s in sentence: calc_cksum ^= ord(s) return '%02x' % calc_cksum # 生成小写两位十六进制,自动补前导零
如果需要大写的十六进制结果(比如'02'保持小写或转为'02','FF'转为大写),只需要把格式符改成%02X即可:
return '%02X' % calc_cksum
关于.zfill(2)的可行性
其实你考虑的.zfill(2)方法是可以正常工作的,因为XOR后的结果范围是0-255(单个ASCII字符的ord值是0-255,多次XOR后结果仍在这个区间),对应的十六进制最多两位。所以修改原代码为下面这样也能解决问题:
def getCheckSum(sentence): calc_cksum = 0 for s in sentence: calc_cksum ^= ord(s) return str(hex(calc_cksum)).strip('0x').zfill(2)
不过这种方式需要多一步字符串处理,不如直接格式化来得直观和高效。
测试验证
比如当校验和结果为0x02时,两种方法都会返回'02';结果为0x20时返回'20';结果为0xFF时返回'ff'(或'FF'),完全符合需求。
内容的提问来源于stack exchange,提问作者bipster
相关产品推荐
相关产品推荐

