Python 2.7字符串十六进制XOR校验和输出补零问题求助
解决Python 2.7中XOR校验和十六进制输出的格式问题
嘿,这个问题我之前也碰到过!你的核心问题出在strip('0x')这个操作上——它不是只去掉开头的0x,而是会移除字符串两端所有属于'0x'字符集的字符。比如当结果是0x02时,strip('0x')会把开头的0和x去掉,还会把剩下的02开头的0也去掉(因为0在字符集里),最后就只剩'2'了,这就是你遇到格式问题的根源。
解决方案:用格式化字符串或切片+补0替代strip
这里有两种可靠的修复方式,都能确保输出始终是两位十六进制字符,不足两位时自动补前导0:
方法1:使用format()函数(推荐)
Python 2.7支持格式化字符串语法,直接生成符合要求的两位十六进制字符串,比先转hex()再处理更简洁可靠:
def getCheckSum(sentence): calc_cksum = 0 for s in sentence: calc_cksum ^= ord(s) # 格式化为两位小写十六进制,不足补前导0 return "{:02x}".format(calc_cksum) # 如果需要大写十六进制,改成: # return "{:02X}".format(calc_cksum) print getCheckSum('SOME,1.948.090,SENTENCE,H,ERE')
方法2:切片替代strip + zfill补0
如果你更习惯用hex()函数,可以通过切片只去掉开头的0x,再用zfill(2)确保长度为2:
def getCheckSum(sentence): calc_cksum = 0 for s in sentence: calc_cksum ^= ord(s) # 去掉前两位的'0x',再补前导0到两位 return hex(calc_cksum)[2:].zfill(2) print getCheckSum('SOME,1.948.090,SENTENCE,H,ERE')
效果验证
- 当校验和为
0x02时,会输出'02'(而非'2') - 当校验和为
0x20时,会输出'20'(保留末尾的0) - 当校验和为
0x00时,会输出'00'(不会变成空字符串)
内容的提问来源于stack exchange,提问作者bipster
相关产品推荐
相关产品推荐

