如何在Python中将一行十六进制代码(\ x)转换为十六进制地址(0x)?

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

如何将十六进制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
2个回答
0
投票
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字符组成的字符串。了解您实际想要实现的目标将非常有帮助。


0
投票

在开始执行任何操作之前,我始终会验证输入是否正确。因此,使用regexp,我想到了以下内容:

import re

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

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转换。

© www.soinside.com 2019 - 2024. All rights reserved.