反转一个包含十六进制字符的字符串的字节顺序

9

我有一个包含十六进制字符的长字符串,例如:

string = "AA55CC3301AA55CC330F234567"

我正在使用

string.to_bytes(4, 'little')

我希望最终的字符串如下所示:
6745230F33CC55AA0133CC55AA

但是我遇到了一个错误

AttributeError: 'str' object has no attribute 'to_bytes'

这里出了什么问题?


1
这回答解决了你的问题吗?将Python int转换为大端字节字符串 - TAbdiukov
5个回答

9

to_bytes 只适用于整数,据我所知。

您可以使用 bytearray

>>> ba = bytearray.fromhex("AA55CC3301AA55CC330F234567")
>>> ba.reverse()

使用format函数将其转换回字符串:

>>> s = ''.join(format(x, '02x') for x in ba)
>>> print(s.upper())
6745230F33CC55AA0133CC55AA

要将其转换回十六进制,您只需调用s.hex()即可。 - lightstack

1
为了在小端和大端之间进行转换,您可以使用基于int.to_bytesint.from_bytesconvert_hex函数:
def int2bytes(i, enc):
    return i.to_bytes((i.bit_length() + 7) // 8, enc)

def convert_hex(str, enc1, enc2):
    return int2bytes(int.from_bytes(bytes.fromhex(str), enc1), enc2).hex()

be = "AA55CC3301AA55CC330F234567"
convert_hex(be, 'big', 'little')

0

注意,你的问题与2009年的这个问题非常相似。虽然旧线程要求单向转换,而你要求“反向”转换,但无论你从哪种字节顺序开始,实际上都是同一件事。让我来展示一下,

0x12345678 -> 0x78563412 -> 0x12345678

使用软件黑客工具pwntools进行转换非常容易。特别是为了避免打包和解包混乱, pwntools嵌入了p32()函数,专门用于此目的

import pwntools

x2 = p32(x1)

-2

这是你正在寻找的答案/代码吗?

def little(string):
 t= bytearray.fromhex(string)
 t.reverse()
 return ''.join(format(x,'02x') for x in t).upper()
little(s=AA55CC3301AA55CC330F234567)

33CC55AACC55AA016745230F 这就是我想要的。 - TimSandiego Hollister
你想要的是将输入的AA55CC3301AA55CC330F234567转换成输出33CC55AACC55AA016745230F吗? - Shivam Chawla
你的输入是13495340714998364417400470979943,这就是为什么输入是AA55CC3301AA55CC330F234567? - Shivam Chawla

-4
也许你可以反转字符串,其中一种方法是:
string = "AA55CC3301AA55CC330F234567"[::-1]

2
这是完全不正确的。改变字节序,翻转字符串对于我们人类来说似乎是正确的,但实际上是错误的。例如,如果我们有一个字节数组或“0x12 0x34 0x56 0x78”,改变字节序的输出将是“0x78 0x56 0x34 0x12”,而不是“0x87 0x65 0x43 0x21”。 - TAbdiukov
我不能点赞,因为这个答案没有正确地回答Tim的问题。但是我有一个小端二进制字符串,[::-1]切片技巧的复习对我非常有帮助,所以谢谢你。 - rdtsc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接