from_bytes 和 unpack 计算的区别

问题描述

我一直试图弄清楚为什么这个字节数组会使用两种方法导致不同的结果:

print(msg[16:20])
>>> b'\xe4\x86\xaaU'
msg[16:20].hex()
>>> e486aa55
print(int.from_bytes(msg[16:20],byteorder='big',signed='False'))
>>> -460936619
print(unpack_from('!I',msg,offset=16)[0])
>>> 3834030677
print(unpack('!I',msg[16:20])[0])
>>> 3834030677

使用内置 from_bytes() 函数计算出错误结果是怎么回事?我自己重新计算了它 (https://stackoverflow.com/a/50509434),结果应该与使用 unpack()

的结果相似
228*256^3+134*256^2+170*256^1+85+256^0 = 3834030677

希望能在你们的帮助下找出我的错/错误想法 - 非常感谢!

解决方法

使用 signed = False 而不是 signed = 'False'

'False' 是一个字符串,因为它是非空的,所以它被视为一个真值。因此,数字被签名。

k = b'\xe4\x86\xaaU'

# UNSIGNED
print(int.from_bytes(k,byteorder = 'big',signed = False))

# SIGNED
print(int.from_bytes(k,signed = True))
print(int.from_bytes(k,signed = 'False'))

Try it online!