十进制转Hex 2's complement时位数不足缺失前导0问题求助
解决方案
问题出在hex()函数返回的字符串不会自动补前导零以达到固定位数,只需修改函数,在计算补码值后,通过字符串格式化强制输出指定长度的十六进制字符串即可:
def tohex(val, nbits): comp_val = (val + (1 << nbits)) % (1 << nbits) # 计算十六进制所需位数:每4位二进制对应1位十六进制 hex_length = nbits // 4 # 格式化输出:固定长度、大写、无0x前缀,不足补前导零 return f"{comp_val:0{hex_length}X}"
效果验证
针对你的示例数据:
- 当
val=688220028058186626、nbits=64时,hex_length=16,函数返回098D0C781BB7B382,与在线工具结果一致。 - 其他两个长位数osiId转换后也会保持16位格式,比如
3858201547035376271会返回358B15DD8AE7FA8F,符合要求。
原理说明
原函数的补码计算逻辑是正确的,问题仅在于输出格式:hex()只会返回刚好能表示数值的十六进制字符,不会补前导零。通过f"{comp_val:0{hex_length}X}"格式化:
0{hex_length}指定固定长度,不足时用前导零填充X表示输出大写十六进制字符,若需要小写可替换为x
内容的提问来源于stack exchange,提问作者Coldshowers
相关产品推荐
相关产品推荐

