无法将字节转换为整数

3
我有下一个值。
value = bytearray(b'\x85\x13\xbd|\xfb\xbc\xc3\x95\xbeL6L\xfa\xbf0U_`$]\xca\xee]z\xef\xa0\xd6(\x15\x8b\xca\x0e\x1f7\xa9\xf0\xa4\x98\xc5\xdf\xcdM5\xef\xc2\x052`\xeb\x13\xd9\x99B.\x95\xb2\xbd\x96\xd9\x14\xe6F\x9e\xfd\xd8\x00')

当我尝试在Python3.x中进行转换时,它能够很好地工作。

>>> int.from_bytes(value, byteorder='little')
2909369579440607969688280064437289348250138784421305732473112318543540722321676649649580720015118044118243611774710427666475769804427735898727217762490192773

如何在Python2.7中进行转换?我已经阅读了将字节字符串转换为整数(Python)

的内容。

struct.unpack(fmt, value)[0]

但是不知道如何使用fmt。


你只是想从中得到一个大数字吗? - LexyStardust
是的,我想要。我无法想象我需要在 fmt 中放什么。这是值的长度吗? - discort
2
struct.unpack 对于你的情况不合适,因为你有太多字节。你需要查看 https://dev59.com/J3RB5IYBdhLWcg3w-8Lo#444814。 - Robᵩ
1
@Robᵩ:几乎了解了,我们需要反转“value”才能得到与OP中相同的数字。例如,int(str(value[::-1]).encode('hex'), 16) 或者 sum(v << (8 * i) for i,v in enumerate(value)) - PM 2Ring
2个回答

6

你可以在 Python 2 中自己编写 from_bytes 函数:

def from_bytes (data, big_endian = False):
    if isinstance(data, str):
        data = bytearray(data)
    if big_endian:
        data = reversed(data)
    num = 0
    for offset, byte in enumerate(data):
        num += byte << (offset * 8)
    return num

像这样使用:

>>> data = b'\x85\x13\xbd|\xfb\xbc\xc3\x95\xbeL6L\xfa\xbf0U_`$]\xca\xee]z\xef\xa0\xd6(\x15\x8b\xca\x0e\x1f7\xa9\xf0\xa4\x98\xc5\xdf\xcdM5\xef\xc2\x052`\xeb\x13\xd9\x99B.\x95\xb2\xbd\x96\xd9\x14\xe6F\x9e\xfd\xd8\x00'
>>> from_bytes(data)
2909369579440607969688280064437289348250138784421305732473112318543540722321676649649580720015118044118243611774710427666475769804427735898727217762490192773L

关于struct,你不能真正使用它,因为它只支持解包特定类型的元素,最多8字节整数。但是因为你想处理任意字节字符串,所以你需要使用其他东西。

4
您可以使用.encode('hex')int(x, 16)的组合:
num = int(str(value).encode('hex'), 16)

请注意,您需要使用类似于以下的内容:
int(''.join(reversed(value)).encode('hex'), 16)

为了将其解析为“little-endian”格式。
参考来源:https://dev59.com/J3RB5IYBdhLWcg3w-8Lo#444814

请注意,您需要使用类似于 int(''.join(reversed(value)).encode('hex'), 16) 的内容来解析little endian。 - poke
1
经过基准测试,我发现这比我的解决方案快得离谱,尽管它在解析字符串...好发现! - poke
你可以使用str(value[::-1])代替''.join(reversed(value))来表示小端序,不确定哪种方法更优。 - Mark Ransom

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