'long'对象没有属性'__getitem__'

时间:2018-09-05 11:22:25

标签: python

我正在以这种格式进行按摩: '02 01 01 21 03 03 02 02 01 01 20 b6 01 0 26 cd 00 03 30 63 a4 22 01'

并且需要解析它,转换为十六进制,切成薄片然后转换回去,但是不确定我是否做对了。我从问题的标题中得到了这个错误,因为“ buf”显然是一个列表,而不是字符串。其实,我不确定我是否正在正确执行此转换?

def parse_code(msg):
    buf = (hashlib.sha256(bytearray.fromhex(msg)).hexdigest())
    buf = int(buf, 16)

    datetime_now = datetime.now()
    log_date = datetime_now.isoformat()

    try:
        prepare_adress = buf[16:22]
        hex_adress = int(prepare_adress, 16)
        new_adress =hex_adress + 0x200
        adress = hex(new_adress).upper()
        id = buf[4:]
        prepare_usage = buf[1:2]
        hex_usage = int(prepare_usage, 16)
        new_usage =hex_usage + 0x200
        usage = hex(new_usage).upper()
        time_a = int(time())
    except Exception as e: 
        print(e)

有什么主意如何处理错误,也许有一些建议,可以提供更好的方法将消息转换为十六进制?

1 个答案:

答案 0 :(得分:2)

第一件事:帮自己一个忙,摆脱这个Braindead的try / except子句,该子句完全没有用,当出现问题时,它会阻止您获得完整的回溯(回溯对于调试非常有用,因此您永远不想失去它)。通常,只有捕获异常才能正确处理,否则让它们传播。

现在wrt /您当前的错误原因很明显-此处:

buf = int(buf, 16)

您将buf设为整数。然后在这里:

prepare_adress = buf[16:22]

您尝试对其进行切片-这是没有意义的,整数是标量,而不是序列,并且不能以任何方式下标,切片或迭代。