计算 Python 中的十六进制校验和 3
calculate checksum hex in Python 3
我想计算校验和。我想要执行的过程如下所示;
第一步
a="10F8000041303131303030353000000000000000"
第 2 步
10+F8+00+00+41+30+31+31+30+30+30+35+30+00+00+00+00+00+00+00 = D0
第 3 步
~D0 = 2F -> 2F + 1 = 30
我试过了;
def calc_checksum_two(s):
return '%2X' % (-(sum(ord(c) for c in s) % 256) & 0xFF)
print(calc_checksum_two(a))
结果;
3D
b = [a[i:i+2] for i in range(0, len(a), 2)] # ['10', 'F8', '00', ...
c = [int(i, 16) for i in b] # [16, 248, 0, ...
d = 256 - sum(c) % 256 # 0x30
e = hex(d)[2:] # '30'
与s="10F8000041303131303030353000000000000000
、sum(ord(c) for c in s)
会对每个字符的每个ord值求和。这将求和 [ord('1'), ord('0'), ord('F'), ...]
。这不是你想要的。
要从该字符串构建字节数组,您应该使用:
[ a[i:i+2]] for i in range(0, len(a), 2) ]
这将创建一个像这样的数组:['10', 'F8', '00', ...]
然后将字符串 hex/base16 转换为整数使用 int(hex_string,16)
应该可以,但这里是函数
def calc_checksum_two(a):
return hex(((sum(int(a[i:i+2],16) for i in range(0, len(a), 2))%0x100)^0xFF)+1)[2:]
我想计算校验和。我想要执行的过程如下所示;
第一步
a="10F8000041303131303030353000000000000000"
第 2 步
10+F8+00+00+41+30+31+31+30+30+30+35+30+00+00+00+00+00+00+00 = D0
第 3 步
~D0 = 2F -> 2F + 1 = 30
我试过了;
def calc_checksum_two(s):
return '%2X' % (-(sum(ord(c) for c in s) % 256) & 0xFF)
print(calc_checksum_two(a))
结果;
3D
b = [a[i:i+2] for i in range(0, len(a), 2)] # ['10', 'F8', '00', ...
c = [int(i, 16) for i in b] # [16, 248, 0, ...
d = 256 - sum(c) % 256 # 0x30
e = hex(d)[2:] # '30'
与s="10F8000041303131303030353000000000000000
、sum(ord(c) for c in s)
会对每个字符的每个ord值求和。这将求和 [ord('1'), ord('0'), ord('F'), ...]
。这不是你想要的。
要从该字符串构建字节数组,您应该使用:
[ a[i:i+2]] for i in range(0, len(a), 2) ]
这将创建一个像这样的数组:['10', 'F8', '00', ...]
然后将字符串 hex/base16 转换为整数使用 int(hex_string,16)
应该可以,但这里是函数
def calc_checksum_two(a):
return hex(((sum(int(a[i:i+2],16) for i in range(0, len(a), 2))%0x100)^0xFF)+1)[2:]