用python解码十六进制数

问题描述 投票:0回答:1

我目前正在尝试获取使用python3.8保存在设备上的MAC地址,并且出现以下错误:

在位置3的fromhex()arg中找到的非十六进制数

我知道这是解码错误。这是代码:

def val2addr(val):   
    if val:
        address = ""
        for ch in val:
            if(not int(ch)):
                address += ':'.join(format(s, '02x') for s in bytes.fromhex(str(ch))).replace("\0", "")
                address = address.strip(' ').replace(' ', ':')[0: 17]
            else:
                address += str(ch)
        return address + ':'.join(format(s, '02x') for s in bytes.fromhex(str(ch))).replace("\0", "")
    return "[!] No MAC [!]"
def print_networks():
    net = u"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"+\
          "\\NetworkList\\Signatures\\Unmanaged"
    print(str(HKEY_LOCAL_MACHINE) + net)
    key = OpenKey(HKEY_LOCAL_MACHINE, net, 0, (KEY_WOW64_64KEY + KEY_READ))
    print('\n[*] Networks You have Joined:\n')

    for network in range(100):
        try:
            guid = EnumKey(key, network)
            netkey = OpenKey(key, str(guid))
            mac = QueryValueEx(netkey, 'DefaultGatewayMac')[0]
            mac = val2addr(mac)
            network_name = QueryValueEx(netkey, 'Description')[0]
            print("[+] Network Name: " + network_name + "[+] Mac: " + mac)
            CloseKey(netkey)
        except Exception as e:
            print(e)
            break

def main():
    print_networks()

if __name__ == '__main__':
    main()

我几乎尝试了可以​​在这里或在互联网上找到的所有解决方案,但没有一个对我有用!

谢谢您的帮助!

python registry mac-address
1个回答
0
投票

fromhex函数期望的字符串长度至少为两位数(因为每个单独的字节为两位十六进制数),并且您只将其传递给一个字符。如果您打算将输入数字零填充,则可以通过在其前面加上“ 0”来做到这一点:

def val2addr(val: str) -> str:
    if val:
        address = ""
        for ch in val:
            if not int(ch):
                address += ':'.join(
                    format(s, '02x') for s in bytes.fromhex("0"+ch)
                ).replace("\0", "")
                address = address.strip(' ').replace(' ', ':')[0:17]
            else:
                address += str(ch)
        return address + ':'.join(
            format(s, '02x') for s in bytes.fromhex("0"+ch)
        ).replace("\0", "")
    return "[!] No MAC [!]"


print(val2addr("1234"))  # prints "123404"
© www.soinside.com 2019 - 2024. All rights reserved.