如何在Python中将一个256位的大端整数转换为小端?

3
我希望这不会太复杂。我有一个256位十六进制整数编码为大端序,需要转换为小端序。Python的struct模块通常可以胜任,但是官方文档中没有列出与我所需格式接近的大小。

使用struct的非长度特定类型(尽管我可能做错了)似乎不起作用:

>> x = 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000'
>> y = struct.unpack('>64s', x)[0] # Unpacking as big-endian
>> z = struct.pack('<64s', y) # Repacking as little-endian
>> print z
'ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000'

示例代码(所需结果):

>> x = 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000'
>> y = endianSwap(x)
>> print y
'00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff'

1
你正在将其打包和解包为字符串。字符串没有字节序。 - Lennart Regebro
2个回答

8

struct 模块无法处理 256 位的数字。因此,您必须手动进行编码。

首先,您应该将其转换为字节:

x = 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000'
a = x # for having more successive variables
b = a.decode('hex')
print repr(b)
# -> '\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00'

您可以使用@Lennart的方法将其反转

c = b[::-1]
# -> '\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'

d = c.encode('hex')
z = d
print z
# -> 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff

我仍在学习Python,所以有人能澄清一下Python 3.3中的等效选项是什么吗?另外,为什么不能使用切片来完成这个操作?为什么要转换为字节? - Aussie Cryptocurrency

1
>>> big = 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000'
>>> big[::-1]
'00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff'

在我看来不太好。如果第一个字节是 ef,那么结果的最后一个字节会变成 fe,但实际上应该是 ef - glglgl
@glglgl 嗯,这取决于它是哪种大端。你假设的8位小端字节和大端字节顺序可能是一个好的假设。我只是做了最简单的事情。:-P - Lennart Regebro

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