【问题标题】:How to get line of hex codes (\x) to hex address (0x) in Python?如何在 Python 中将一行十六进制代码 (\x) 转换为十六进制地址 (0x)?
【发布时间】:2020-04-17 18:30:57
【问题描述】:

如何将这行十六进制 ASCII 的字节转换为如下所示的十六进制地址?

我已经设法将它们分开到每一行,但我遇到了 python 3 hex() 的问题,因为当我尝试执行诸如 line.hex() 之类的操作时,它会引发诸如 str 类型之类的错误。

输入 \xAA\xBB\xCC\xDD\xEE\xFF\x11\x22\x33\x44\x55\x66\x77\x88\x99\x00

输出

0xDDCCBBAA
0x2211FFEE
0x66554433
0x00998877

我的代码

import re

a=r"\xAA\xBB\xCC\xDD\xEE\xFF\x11\x22\x33\x44\x55\x66\x77\x88\x99\x00"

r = '\n'.join(re.findall('................|.$', a))

for line in r.splitlines(): 
    print(line)

【问题讨论】:

    标签: python python-3.x sorting hex


    【解决方案1】:
    s = "\xAA\xBB\xCC\xDD\xEE\xFF\x11\x22\x33\x44\x55\x66\x77\x88\x99\x00"
    print("\n".join([hex(ord(c)) for c in s]))
    

    将输出:

    0xaa
    0xbb
    0xcc
    0xdd
    0xee
    0xff
    0x11
    0x22
    0x33
    0x44
    0x55
    0x66
    0x77
    0x88
    0x99
    0x0
    

    这是你需要的吗?这假定输入字符串 s 是由 Unicode 字符组成的字符串。了解您真正想要实现的目标会非常有帮助。

    【讨论】:

    • 我读了这个问题,要求对 32 位字进行静态大小的十六进制编码(根据输出)。当然,这需要作者的一些反馈来确认。
    【解决方案2】:

    我总是在开始做任何事情之前验证我的输入是否正确。所以使用正则表达式,我想出了以下内容:

    import re
    
    a=r"\xAA\xBB\xCC\xDD\xEE\xFF\x11\x22\x33\x44\x55\x66\x77\x88\x99\x00"
    
    # matches a word consisting of 4 bytes encoded as \xHH where H is any hex character
    listOfFourHexBytes = re.findall(r'(?:\\x[0-9a-fA-F]{2}){4}', a)
    if (len(a) != 4 * 16 or len(listOfFourHexBytes) != 4):
        raise Exception("Input does not consist of 16 hexadecimal bytes")
    for fourHexbytes in listOfFourHexBytes:
        justFourHexBytes = re.sub(r'\\x', '', fourHexbytes)
        print("0x" + justFourHexBytes)
    
        # not asked for, but generate number from hex value first
        n = int(justFourHexBytes, 16)
        print("0x%08X" % n)
    

    它首先以您要求的格式查找实际的十六进制字节,以 4 个十六进制编码字节为一组。然后它检查是否确实有 4 个,确保输入字符串的大小正确(没有虚假的跳过字符)。然后它遍历那些,从字符串中删除\x。下一步当然很简单,只需在结果中添加0x 并打印出来。

    通常你需要对这些值做一些事情,所以我免费添加了int 转换。

    【讨论】:

    • 感谢您对 Python 代码的任何评论或编辑,Python 不是我的第一语言。
    猜你喜欢
    • 2019-01-01
    • 1970-01-01
    • 2010-12-15
    • 2011-08-13
    • 2020-08-08
    • 1970-01-01
    • 2018-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多