在python中计算十六进制校验和

时间:2013-11-02 16:55:26

标签: python

我需要编写一个函数来计算其参数的校验和 然后发送带有校验和的参数。

当我手动计算校验和时,我正在做这样的事情:

data = '\x03\x2F\x00\x00\x02\x12\x01\x47'

然后

s.sendall(data)

有没有办法将数据写为:

data = "03 2F 00 00 02 12 01"

让python知道我想要的数据是什么 看作十六进制? 如果python查看为十六进制将我的函数看起来像

for i in range(len(data)):
    sum = sum +data[i]

或类似的东西?

5 个答案:

答案 0 :(得分:4)

要表示为十六进制,请使用binascii.hexlify

>>> import binascii
>>> binascii.hexlify('\x03\x2F\x00\x00\x02\x12\x01\x47')
'032f000002120147'
>>> ' '.join(binascii.hexlify(ch) for ch in '\x03\x2F\x00\x00\x02\x12\x01\x47')
'03 2f 00 00 02 12 01 47'

要计算校验和,请迭代每个字节:

data = '\x03\x2F\x00\x00\x02\x12\x01\x47'

checksum = 0
for ch in data:
    checksum += ord(ch)  # ord('\x03`) -> 3

或使用summap

checksum = sum(map(ord, data))

答案 1 :(得分:1)

你期望看到这个:?

input ='\x03\x2F\x00\x00\x02\x12\x01\x47'
output = ' '.join([('{:02X}'.format(ord(c))) for c in input])
print(output)

打印:

  

03 2F 00 00 02 12 01 47

如果没有 - 澄清你的问题

答案 2 :(得分:1)

我认为你想把它们作为价值阅读,对吗?尝试:

val = '5c'
hval = int(val, 16)
print hval
  
    

92

  

(十进制为0x5C)

走向另一个方向:

val = '%x' % 92
print val
  
    

'5C'

  

答案 3 :(得分:1)

data = "03 2f 00 00 02 12 01 47"

for letter in data.replace(' ', '').decode('hex'):
    print hex(ord(letter))

0x3
0x2f
0x0
0x0
0x2
0x12
0x1
0x47

答案 4 :(得分:0)

这就是我想要做的事情

def sum_words(data):
return sum(int(x, 16) for x in data.split())

data = "03 2F 00 00 02 12 01"
print(sum_words(data))