Python十六进制转换函数中的Base 16错误
大家好,我在web服务器Tornado中用Python编写了这部分代码:Python十六进制转换函数中的Base 16错误,python,hex,tornado,Python,Hex,Tornado,大家好,我在web服务器Tornado中用Python编写了这部分代码: # Transform an integer into a string with HEX symbols in the format that is # understandable by Quantaservd def hextransform(data, length): data = hex(data)[2:] assert(len(data) <= length) # zero-pa
# Transform an integer into a string with HEX symbols in the format that is
# understandable by Quantaservd
def hextransform(data, length):
data = hex(data)[2:]
assert(len(data) <= length)
# zero-padding
data = ('0' * (length - len(data))) + data
# Swap 'bytes' in the network ID
data = list(data)
for i in range(0, length, 2):
tmp = data[i]
data[i] = data[i + 1]
data[i + 1] = tmp
# Reverse the whole string (TODO: CHECK)
data.reverse()
data = "".join(data)
return data
def hex2char(i):
return ('0'+hex(i)[2:])[-2:]
def cmd_payload(op1_hex, op2_hex, l, pl, ck):
return hex2char(op1_hex) + hex2char(op2_hex) + hex2char(l) + pl + hex2char(ck)
def packet2json(op_group, op_code, payload):
lun = len(payload) / 2
fcs = op_group ^ op_code ^ lun #fcs = XOR of op_group, op_code, lenght and payload
for i in range(len(payload)):
if ((i % 2) == 1):
fcs = fcs ^ int('0x' + payload[(i - 1):(i + 1)], 16)
print int('0x' + payload[(i - 1):(i + 1)], 16)
s=cmd_payload(op_group,op_code, lun, payload, fcs)
#p = r '{"data": "' + s + r '"}'
p=r'{"data": "'+s+r'"}'
return p
def invert2bytes(stringa, ind):
byte_low = stringa[ind:ind + 2]
ind += 2
byte_high = stringa[ind:ind + 2]
return byte_high + byte_low
当程序到达hextransform函数时。。。。我不知道这是否是一个基数错误,因为在这个错误中,它表示基数19,而μ函数在基数16中。或者如果问题是“*”字符
有什么想法吗?多谢各位
编辑
我添加了调用hextransform函数的处理程序中的这部分代码:
#Command OnOffCmd_SetState
if command in ['ON', 'OFF', 'TOGGLE']:
op_group = "70"
op_code = "50"
packet_meta = "*%s;%s;%s;%s;02%s%s600080000%s#"
pkt_len = hextransform(16, 2)
netid = hextransform(int(nid), 16)
sens_id = hextransform(int(sid) >> 16, 4)
sens_id_little = invert2bytes(sens_id,0)
cluster_id = hextransform(int(sid) & 0x00FFFF, 4)
end_point = "08"
if command == 'ON':
cmd_data = "01"
elif command == 'OFF':
cmd_data = "00"
elif command == 'TOGGLE':
cmd_data = "02"
packet = packet_meta % (netid, op_group, op_code, pkt_len, sens_id, end_point, cmd_data)
packet = packet.upper()
op_group_hex=0x70
op_code_hex=0x50
cmdjson = packet2json(op_group_hex,op_code_hex, packet)
#Command ZDP-RestartNwk.Request
elif command == 'RESTARTNWK':
op_group = "A3"
op_code = "E0"
netid = hextransform(int(nid), 16)
packet_meta = "*%s;%s;%s;%s;02600080000#"
pkt_len = hextransform(0, 1)
packet = packet_meta % (netid, op_group, op_code, pkt_len)
packet = packet.upper()
op_group_hex=0xA3
op_code_hex=0xE0
cmdjson = packet2json(op_group_hex,op_code_hex, packet)
#Command ZDP-IEEE_addr.Request
elif command == 'IDENTIFY':
op_group = "A2"
op_code = "05"
packet_meta = "*%s;%s;%s;%s;02%s600080000#"
pkt_len = hextransform(2, 1)
netid = hextransform(int(nid), 16)
sens_id = hextransform(int(sid) >> 16, 4)
sens_id_little = invert2bytes(sens_id,0)
packet = packet_meta % (netid, op_group, op_code, pkt_len, sens_id)
packet = packet.upper()
op_group_hex=0xA2
op_code_hex=0x05
cmdjson = packet2json(op_group_hex,op_code_hex, packet)
编辑2
如果我写
pkt\u len=hextransform(2,1)
我有错误。如果我有
pkt_len = hextransform(16, 2)
通读一遍。它考虑了何时使用16对0的基数
当您声明使用的是base 16(正如您所做的那样)时,我不会包含0x
——这是表示十六进制数的特殊语法,但实际上不是十六进制本身
因此,要么:
0x
前缀,或如果这两个都不起作用,那么您的有效负载字符串就有问题。它可能包含您意想不到的字符。请将您的代码拆分为一个字符。我们不打算阅读所有这些(缩进不正确的)代码。似乎这段代码至少有两个不可能的地方:(1)您有一个5个字符的文本传递给int(),但“0x”+任何[i-1:i+1]片段最多应该是4个字符。(2) Python不会随机更改函数的参数。。。你确定你在给我们看正确的代码吗?那好多了。我必须说,当您传递文本16时,错误消息中的“base 19”让我感到困惑。但是在任何情况下,
payload[(i-1):(i+1)]
都不包含您认为它的功能;在转换为int
之前,请尝试打印它。对不起,您可以这样给我写一个答案吗?我必须写这个代码?在中,我不太了解..看起来有效负载不是十六进制。
pkt_len = hextransform(16, 2)