2

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

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

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]

或类似的东西?

4

5 回答 5

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

或使用sumand map

checksum = sum(map(ord, data))
于 2013-11-02T16:58:57.367 回答
1

我认为您想将这些作为值读取,对吗?尝试:

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

92

(十进制为 0x5C)

去另一个方向:

val = '%x' % 92
print val

'5c'

于 2013-11-02T17:14:14.987 回答
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
于 2013-11-02T17:14:37.467 回答
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

如果不是 - 澄清你的问题

于 2013-11-02T17:11:45.243 回答
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))
于 2013-11-03T21:39:09.227 回答