首页 > 解决方案 > 如何修复python int太大而无法转换为c long

问题描述

我使用 Windows 10 为我忘记密码的 DVR 生成安全代码。

在我的笔记本上安装了 Python 3.7.2

内存:16GB 硬盘:1TB

#!/usr/bin/env python3

import sys
from re import search
from numpy import uint32
from requests import get
from datetime import datetime

def keygen(seed):
    magic = 0
    for i, char in enumerate(seed):
        i += 1
        magic += i * ord(char) ^ i
    secret = str(uint32(1751873395 * magic))

    c = str.maketrans("012345678", "QRSqrdeyz")
    return secret.translate(c)

def get_serial_date(ip):
    try:
        req = get("http://192.168.178.43/upnpdevicedesc.xml")
    except Exception as e:
        print("Unable to connect to {ip}:\n{e}")
        sys.exit(-1)

    model = search("<modelNumber>(.*)</modelNumber>", req.text).group(1)
    serial = search("<serialNumber>(.*)</serialNumber>", req.text).group(1)
    serial = serial.replace(model, "")
    datef = datetime.strptime(req.headers["Date"], "%a, %d %b %Y %H:%M:%S GMT")
    date = datef.strftime("%Y%m%d")

    return "{serial}{date}"

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("Usage: {sys.argv[0]} <ip>")
        print("Connects to a   device and generates a security key")
        sys.exit(1)
    seed = get_serial_date(sys.argv[1])
    print("Got seed: {seed}")
    key = keygen(seed)
    print("Generated security key: {key}")

有没有办法修复这个错误代码或者我需要对我的笔记本设置做些什么?

这是我得到的错误代码

Got seed: {seed}
Traceback (most recent call last):
  File "beer.py", line 41, in <module>
    key = keygen(seed)
  File "beer.py", line 14, in keygen
    secret = str(uint32(1751873395 * magic))
OverflowError: Python int too large to convert to C long

标签: python

解决方案


如果您使用uint32将数字减少到 range 0 … 2**32-1,您可以使用它来代替:

secret = str((1751873395 * magic) & 0xffffffff)

还要注意,在循环enumerate中结合使用i += 1是非常混乱的。


推荐阅读